【问题标题】:NotifyIcon not showing context menu when app running background worker应用程序运行后台工作程序时,NotifyIcon 不显示上下文菜单
【发布时间】:2018-01-23 21:18:53
【问题描述】:

我的 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);触发上下文菜单?

【问题讨论】:

  • 也许你没有在 UI 线程上下文中显示你的上下文菜单?!请看这里stackoverflow.com/questions/11625208/…
  • sn-ps 对诊断这个问题毫无用处。不要最小化你的用户界面。它仍然响应吗?比如说,你还能关上窗户吗?如果不是,那么它也不会响应 MouseDown 事件。
  • 作为旁注,BackgroundWorker 类是 technologically obsolete。你不应该真的将这个东西用于新的开发。请改用 Task.Run 和 async/await。

标签: c# wpf multithreading backgroundworker


【解决方案1】:

Program.cs 中将属性 [STAThread] 更改为 [MTAThread]

【讨论】:

    【解决方案2】:

    解决方案原来是 Sebastian 在 cmets 中建议的线程问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多