首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从任务栏打开Winform

从任务栏打开Winform
EN

Stack Overflow用户
提问于 2013-01-03 13:08:36
回答 1查看 2.8K关注 0票数 2

我有一个Winform,它最初隐藏在启动阶段。

此后,用户可以自由地单击底部的通知图标,并在需要时显示它,并且在最小化通知图标时,需要返回到系统托盘中。

从托盘开始-没问题。当你第一次点击显示它,尽管它出现,然后有一小部分秒看起来它正在消失,然后回来。所以它看起来有点闪烁。

然后,当你最小化它,它进入系统托盘,因为它应该是好的。当您单击再次显示它(在您做了一次之后),它会从系统托盘或任务栏中滑行,我希望它只是出现,而不是小动画。

代码语言:javascript
复制
public class Program : Form
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Program());
    }

    private NotifyIcon trayIcon;
    private ContextMenu trayMenu;

    public Program()
    {
        trayMenu = new ContextMenu();
        trayMenu.MenuItems.Add("Exit", OnExit);
        trayMenu.MenuItems.Add("Show", OnShow);
        trayIcon = new NotifyIcon();
        trayIcon.Text = "MyTrayApp";
        trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);
        trayIcon.ContextMenu = trayMenu;
        trayIcon.Visible = true;
    }

    protected override void OnLoad(EventArgs e)
    {
        Visible = false;
        ShowInTaskbar = false;
        base.OnLoad(e);
    }

    protected override void OnResize(EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
            Visible = false;
            ShowInTaskbar = false;
        }
        base.OnResize(e);
    }

    private void OnExit(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void OnShow(object sender, EventArgs e)
    {
        Visible = true;
        ShowInTaskbar = true;
        TopMost = true;
        WindowState = FormWindowState.Normal;
    }

    protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            trayIcon.Dispose();
        }
        base.Dispose(isDisposing);
    }
}

任何关于如何让它正确地出现的建议都是非常感谢的。

更新

我已经找到了闪烁的原因,它发生在TopMost是最后一次设置,在显示后,所以它重画它在顶部,这是有意义的。

所以现在,它只是让它在没有动画的情况下出现和消失。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-03 13:29:11

编辑:您应该只在Onload()中设置Onload()属性,只需使用Show()Hide()来避免动画,并确保相应地更改WindowState

我将您的代码放入常规的Form (而不是在Program.cs文件中),并删除了所有多余的代码。这是我的结果,它没有显示“双”动画。

代码语言:javascript
复制
public partial class Form1 : Form
    {
        private NotifyIcon trayIcon;
        private ContextMenu trayMenu;

        public Form1()
        {
            InitializeComponent();

            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Name = "Program";

            trayMenu = new ContextMenu();
            trayMenu.MenuItems.Add("Exit");
            trayMenu.MenuItems.Add("Show", FormShow);
            trayIcon = new NotifyIcon();
            trayIcon.Text = "MyTrayApp";
            trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);
            trayIcon.ContextMenu = trayMenu;
            trayIcon.Visible = true;
            TopMost = true;
            Resize += new EventHandler(Form1_Resize);
        }

        void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                ShowInTaskbar = false;
                Hide();
                trayIcon.Visible = true;
            }
        }

        void FormShow(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                WindowState = FormWindowState.Normal;
            }
            ShowInTaskbar = true;
            Show();
            Focus();
            trayIcon.Visible = false;
        }

        protected override void OnLoad(EventArgs e)
        {
            Visible = false;
            ShowInTaskbar = false;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14139576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档