gpt4 book ai didi

c# - NotifyIcon ContextMenu 和太多点击事件

转载 作者:行者123 更新时间:2023-11-30 12:15:16 32 4
gpt4 key购买 nike

我正在使用 NotifyIcon 类在任务栏中显示一个图标。该图标执行 2 个功能 - 当用户单击左键时它应该显示一个窗口,当用户单击右键时它应该显示上下文菜单。除了在用户单击上下文菜单中的选项后显示的窗口之外,这工作正常。这是我的代码:

contextMenuItems = new List<MenuItem>();
contextMenuItems.Add(new MenuItem("Function A", new EventHandler(a_Clicked)));
contextMenuItems.Add(new MenuItem("-"));
contextMenuItems.Add(new MenuItem("Function B", new EventHandler(b_Clicked)));
trayIcon = new System.Windows.Forms.NotifyIcon();
trayIcon.MouseClick += new MouseEventHandler(trayIcon_IconClicked);
trayIcon.Icon = new Icon(GetType(), "Icon.ico");
trayIcon.ContextMenu = contextMenu;
trayIcon.Visible = true;

问题是当用户选择“功能 A”或“功能 B”时,我的 trayIcon_IconClicked 事件被触发。为什么会这样?

谢谢,J

最佳答案

通过将上下文菜单分配给 NotifyIcon 控件,它会自动捕获右键单击并在此处打开分配的上下文菜单。如果您想在实际显示上下文菜单之前执行一些逻辑,请将委托(delegate)分配给 contextMenu.Popup 事件。

...
contextMenu.Popup += new EventHandler(contextMenu_Popup);
...

private void trayIcon_IconClicked(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//Do something here.
}
/* Only do this if you're not setting the trayIcon.ContextMenu property,
otherwise use the contextMenu.Popup event.
else if(e.Button == MouseButtons.Right)
{
//Show uses assigned controls Client location to set position,
//so must go from screen to client coords.
contextMenu.Show(this, this.PointToClient(Cursor.Position));
}
*/
}

private void contextMenu_Popup(object sender, EventArgs e)
{
//Do something before showing the context menu.
}

我猜测窗口弹出的原因是您打开的上下文菜单使用 NotifyIcon 作为目标控件,因此当您单击它时,它会运行您分配给 NotifyIcon 的单击处理程序。

编辑:另一个要考虑的选项是改用 ContextMenuStrip。 NotifyIcon 也有一个 ContextMenuStrip 属性,它似乎有更多与之关联的功能(注意到我可以做更多,可编程明智)。如果由于某种原因无法正常工作,您可能想试一试。

关于c# - NotifyIcon ContextMenu 和太多点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7797661/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com