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

标签 c# wpf multithreading backgroundworker

我的 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 += new MouseEventHandler(myNotifyIcon_MouseDown); 不会触发上下文菜单?

最佳答案

正如 Sebastian 在评论中所建议的,解决方案是线程问题。

关键是使用 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();

    }

关于c# - 当应用程序运行后台工作程序时,NotifyIcon 不显示上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701554/

相关文章:

WPF:删除动画后防止触发 "Completed"事件

c# - 创建的 Windows 窗体需要文本框有光标和返回点击按钮

c# - MSTest:CS0117 'Assert' 不包含 'ThrowsException' 的定义

c# - 这段 RxUI 代码有什么问题?

c# - 跨多个程序集应用全局样式

C# WPF 为所有控件设置标签=名称

multithreading - omp 刷新和 cc-NUMA 架构

java - 房间数据库不需要新的线程来进行长时间的查询操作

java - Java 中的递归感知线程池?

c# - 使用 RedirectToAction 将信息传递给另一个操作 - MVC