我的WPF XAML中定义了一个上下文菜单,如下所示:
<Window.Resources>
<ContextMenu x:Key="MyMenu">
<MenuItem Header="{x:Static props:Resources.MenuItem1}"/>
</ContextMenu>
</Window.Resources>
我正在使用System.Windows.Forms.NotifyIcon
“myIcon”作为托盘图标,因为它的设置和使用非常简单,因为似乎没有标准的MSFT WPF等效版本。不幸的是,当我打电话
this.myIcon.ContextMenu = (ContextMenu)this.Resources["MyMenu"];
因为它们显然不是同一个ContextMenu
类。有没有办法简单地从Controls.ContextMenu
转换为Forms.ContextMenu
?
我不希望通过手动调出我的XAML中定义的上下文菜单来处理通知图标的右键单击鼠标事件。我怀疑当用户使用键盘上的上下文菜单键时,不会发送右键单击鼠标事件。
答案 0 :(得分:2)
不 - 控件适用于完全不同的平台(Winforms vs WPF)。两者之间没有“转换”。
使用支持WPF的a different version of NotifyIcon或编写转换WPF上下文菜单项的“转换”,并将它们添加到Winforms上下文菜单中。
答案 1 :(得分:1)
所以,我认为任何人都很好奇。我最终实现了一个转换器。
using System;
using System.Drawing;
using System.Windows.Controls;
namespace MyApp
{
class NotifyIconEx
{
#region Data
private System.Windows.Forms.NotifyIcon _notifyIcon = new System.Windows.Forms.NotifyIcon();
#endregion // Data
#region Properties
public Icon Icon
{
get { return _notifyIcon.Icon; }
set { _notifyIcon.Icon = value; }
}
public ContextMenu ContextMenu
{
private get { return null; }
set
{
_notifyIcon.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
foreach (var item in value.Items)
{
if (item is MenuItem)
{
var menuItem = item as MenuItem;
var toolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem.Click += (s, e) => menuItem.RaiseEvent(new System.Windows.RoutedEventArgs(MenuItem.ClickEvent));
toolStripMenuItem.Text = menuItem.Header as string;
_notifyIcon.ContextMenuStrip.Items.Add(toolStripMenuItem);
}
else if (item is Separator)
{
_notifyIcon.ContextMenuStrip.Items.Add(new System.Windows.Forms.ToolStripSeparator());
}
else
{
throw new NotImplementedException();
}
}
}
}
public bool Visible
{
get { return _notifyIcon.Visible; }
set { _notifyIcon.Visible = value; }
}
#endregion // Properties
#region API
public void ShowBalloonTip(int timeout)
{
_notifyIcon.ShowBalloonTip(timeout);
}
public void ShowBalloonTip(int timeout, string tipTitle, string tipText, System.Windows.Forms.ToolTipIcon tipIcon)
{
_notifyIcon.ShowBalloonTip(timeout, tipTitle, tipText, tipIcon);
}
#endregion // API
}
}