C# 有没有办法将Controls.ContextMenu转换为Forms.ContextMenu?
我在WPF XAML中定义了一个上下文菜单,如下所示:C# 有没有办法将Controls.ContextMenu转换为Forms.ContextMenu?,c#,wpf,winforms,xaml,contextmenu,C#,Wpf,Winforms,Xaml,Contextmenu,我在WPF XAML中定义了一个上下文菜单,如下所示: <Window.Resources> <ContextMenu x:Key="MyMenu"> <MenuItem Header="{x:Static props:Resources.MenuItem1}"/> </ContextMenu> </Window.Resources> 因为它们显然不是相同的ContextMenuclass。是否有一种方
<Window.Resources>
<ContextMenu x:Key="MyMenu">
<MenuItem Header="{x:Static props:Resources.MenuItem1}"/>
</ContextMenu>
</Window.Resources>
因为它们显然不是相同的ContextMenu
class。是否有一种方法可以简单地从控件.ContextMenu
转换为表单.ContextMenu
我不希望通过手动打开XAML中定义的上下文菜单来处理notify图标的右键单击鼠标事件。原因是我怀疑当用户使用键盘上的上下文菜单键时,不会发送右键单击鼠标事件 否-这些控件适用于完全不同的平台(Winforms与WPF)。两者之间没有“转换”
要么使用支持WPF的,要么编写一个“转换”,翻译WPF上下文菜单中的项目,并将它们添加到Winforms上下文菜单中。因此,我想任何人都会好奇。我最终实现了一个转换器
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
}
}
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
}
}