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

问题描述:

我的WPF应用程序显示一个窗口,当用户单击一个按钮时,它开始运行其任务,并最小化到通知区域中的托盘项目,就像用户能够取消操作一样。当应用程序运行后台工作人员时,NotifyIcon不显示上下文菜单

在使用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);触发上下文菜单?

+0

也许你不会在UI线程上下文中显示你的上下文菜单?!看到这里pls https://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf –

+0

片段是很无用的诊断这个问题。不要最小化您的用户界面。它是否仍然响应?你能说,还能关上窗户吗?如果不是,那么它也不会响应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(); 

    }