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