【发布时间】: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