当应用程序 运行 后台工作者时 NotifyIcon 不显示上下文菜单
NotifyIcon not showing context menu when app running background worker
我的 WPF 应用程序显示一个 window,当用户单击一个按钮时,它开始 运行 它的任务并最小化到通知区域中的托盘项目,我会在其中使用上下文菜单喜欢的用户可以取消操作。
上下文菜单在使用 BackgroundWorker 之前有效,但是取消无效。由于我已经实现了一个后台工作者,一旦 .运行workerasync() 方法具有 运行.
,上下文菜单就不会出现
我的通知图标:
public NotifyIcon myNotifyIcon;
当我的应用程序 运行s 我是这样设置的:
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);触发上下文菜单?
正如塞巴斯蒂安在评论中所建议的那样,解决方案原来是一个线程问题。
关键是使用 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]
我的 WPF 应用程序显示一个 window,当用户单击一个按钮时,它开始 运行 它的任务并最小化到通知区域中的托盘项目,我会在其中使用上下文菜单喜欢的用户可以取消操作。
上下文菜单在使用 BackgroundWorker 之前有效,但是取消无效。由于我已经实现了一个后台工作者,一旦 .运行workerasync() 方法具有 运行.
,上下文菜单就不会出现我的通知图标:
public NotifyIcon myNotifyIcon;
当我的应用程序 运行s 我是这样设置的:
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);触发上下文菜单?
正如塞巴斯蒂安在评论中所建议的那样,解决方案原来是一个线程问题。
关键是使用 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]