Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序运行后台工作程序时NotifyIcon不显示上下文菜单_C#_Wpf_Multithreading_Backgroundworker - Fatal编程技术网

C# 应用程序运行后台工作程序时NotifyIcon不显示上下文菜单

C# 应用程序运行后台工作程序时NotifyIcon不显示上下文菜单,c#,wpf,multithreading,backgroundworker,C#,Wpf,Multithreading,Backgroundworker,我的WPF应用程序显示一个窗口,当用户单击一个按钮时,它开始运行其任务,并在通知区域中最小化为一个托盘项目,其中有一个上下文菜单,我希望用户能够在其中取消操作 上下文菜单在使用BackgroundWorker之前起作用,但是,取消没有起作用。因为我已经实现了后台工作程序,所以一旦.runworkerasync()方法运行,上下文菜单就不会出现 我的通知图标: public NotifyIcon myNotifyIcon; 当我的应用程序运行时,我将其设置为: private void setu

我的WPF应用程序显示一个窗口,当用户单击一个按钮时,它开始运行其任务,并在通知区域中最小化为一个托盘项目,其中有一个上下文菜单,我希望用户能够在其中取消操作

上下文菜单在使用BackgroundWorker之前起作用,但是,取消没有起作用。因为我已经实现了后台工作程序,所以一旦.runworkerasync()方法运行,上下文菜单就不会出现

我的通知图标:

public NotifyIcon myNotifyIcon;
当我的应用程序运行时,我将其设置为:

private void setup_NotifyIcon()
{
    myNotifyIcon = new NotifyIcon();
    setTrayIcon();

    myNotifyIcon.MouseDown += new MouseEventHandler(myNotifyIcon_MouseDown);

    var menuItemCancel = new MenuItem("Cancel Parsing");
    var contextMenu = new ContextMenu();
    menuItemCancel.Click += new System.EventHandler(this.menuItemCancel_Click);

    contextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { menuItemCancel });
    myNotifyIcon.ContextMenu = contextMenu;

}

    private void menuItemCancel_Click(object Sender, EventArgs e)
    {
        //do something
    }

    void myNotifyIcon_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            //do something
        }
    }
然后,当用户单击按钮时:

worker.RunWorkerAsync();

为什么myNotifyIcon.MouseDown+=新的MouseEventHandler(myNotifyIcon\u MouseDown);触发上下文菜单?

正如塞巴斯蒂安在评论中所建议的,解决方案是线程问题

关键是使用Application.Run()在另一个线程上启动图标,并使图标在代码中可见

完成此操作后,右键单击图标即可工作,正在处理的取消功能也是如此

    private void setup_NotifyIcon()
    {
        Thread notifyThread = new Thread(
        delegate ()
        {
            myNotifyIcon = new NotifyIcon();
            setTrayIcon();

            myNotifyIcon.MouseDown += new MouseEventHandler(myNotifyIcon_MouseDown);

            mnuCancel = new MenuItem("Cancel Parsing");
            menu = new ContextMenu();
            mnuCancel.Click += new System.EventHandler(menuItemCancel_Click);

            menu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { mnuCancel });
            myNotifyIcon.ContextMenu = menu;

            myNotifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't thing there is an error.
            myNotifyIcon.BalloonTipText = "The P6 Parser will minimize to the system tray while working.";
            myNotifyIcon.BalloonTipTitle = "Processing...";

            myNotifyIcon.Visible = true;
            myNotifyIcon.ShowBalloonTip(500);

            myNotifyIcon.Visible = true;
            System.Windows.Forms.Application.Run();
        });
        notifyThread.Start();

    }

Program.cs中,将注释[STAThread]更改为[MTAThread]

也许您没有在UI线程上下文中显示上下文菜单?!请看这里,这些代码片段对于诊断这个问题是非常无用的。不要最小化你的用户界面。它仍然有反应吗?比如说,你还能关上窗户吗?如果不是,那么它也不会响应MouseDown事件。你不应该真的把它用于新的开发。使用
任务。运行
并改为异步/等待。