将新的contextmenu项添加到WindowsFormsHost,它在WPF中具有默认contextmenu
我们正在使用一些ActiveX或windows窗体控件,这些控件没有WPF等效项,因此我们自然使用WindowsFormsHost来承载这些控件。我们通常使用一些通用控件(如按钮)来实现通用功能,从而生成一个UserControl。一段xaml代码如下所示:将新的contextmenu项添加到WindowsFormsHost,它在WPF中具有默认contextmenu,wpf,contextmenu,windowsformshost,Wpf,Contextmenu,Windowsformshost,我们正在使用一些ActiveX或windows窗体控件,这些控件没有WPF等效项,因此我们自然使用WindowsFormsHost来承载这些控件。我们通常使用一些通用控件(如按钮)来实现通用功能,从而生成一个UserControl。一段xaml代码如下所示: <WindowsFormsHost Name="windowsFormsHost1" > <WindowsFormsHost.ContextMenu> <ContextMenu&g
<WindowsFormsHost Name="windowsFormsHost1" >
<WindowsFormsHost.ContextMenu>
<ContextMenu>
<MenuItem Header="_Test1" />
</ContextMenu>
</WindowsFormsHost.ContextMenu>
<AxOWC:AxPivotTable x:Name="pivotTable" />
</WindowsFormsHost>
....
显示上下文菜单(虽然很奇怪)
现在我的问题是,现在只有这个Test1上下文菜单在这里。默认的上下文菜单将不再显示。正如我提到的,我们想要的是在这些默认上下文菜单的顶部添加自定义的内容。这将是我的工作“解决方案”,对于上面的示例,我不知道您是否也需要它来处理WindowsFormsHost
中的子元素。希望这对你有帮助
XAML
编辑
我希望现在它符合您的需要:)而且我正确地理解了您要做的事情您是否能够在
窗口窗体shost1
中获取上下文菜单
对象?所以你可以做\u yourContextMenu\u.Items.Add(newMenuItem)
@WiiMaxx,这实际上是我不理解的部分。在我设置I set IsOpen=True的事件处理程序中,我可以看到ContextMenu实际上只包含自定义项,而不是控件本身提供的默认菜单。因此,我不知道如何获得这些默认菜单,因此无法添加它们(因为控件不在WPF程序集中,我甚至不知道是否可以只使用Items.add来添加它们而不进行转换)。换句话说,我的自定义CM将覆盖默认值,因为它们位于不同的级别,并且只有在我没有自定义CM的情况下,才会弹出默认值。感谢您的回复,但是您试图用此代码解决的问题是什么?可能是我没有清楚地描述我的问题。AxOWC:AxPivotTable(以及我们包装在WindowsFormsHost中的其他WinForms控件)有其默认的ContextMenu,它的类型是System.Windows.Forms.ContextMenu,而不是WPF类型。但是现在我想让自定义上下文菜单项与默认项共存,这样用户就有了一个增强的上下文菜单。但是,我的问题代码,自定义菜单将覆盖/阴影默认上下文菜单,这不是我想要的。哦,看起来我错过了这一部分:o)我将对此进行挖掘是的,谢谢。关于结果,我只想说几句话:我在mouse-down事件的事件处理程序中使用myWFH.ContextMenu.IsOpen=true,您可以在构造函数中这样做。你的代码基本上与我的文章做的事情相似,除了一件事:如果我运行你的代码,自定义上下文菜单将在构建UserControl/窗口时显示一次,仍然隐藏默认上下文菜单,稍后当我右键单击默认上下文菜单时,再次显示自定义上下文菜单。相反,我的代码总是隐藏默认上下文菜单。这两种方法都不能产生预期的效果result@tete我希望现在它是您所需要的,如果它不适合云计算,请告诉我什么是汇编AxOWC
,以便我可以深入挖掘;)非常感谢你的帮助。我对控件仍然有一些问题,但稍后我会再与您联系。
windowsFormsHost1.ContextMenu.IsOpen = True
<Window x:Class="tete.MainWindow"
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns="http://schemas.microsoft.com/netfx/2009/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms">
<Grid>
<av:WindowsFormsHost Name="myWFH">
<wf:ComboBox Name="myCBox">
<wf:ComboBox.ContextMenu>
<wf:ContextMenu>
<wf:ContextMenu.MenuItems>
<wf:MenuItem Text="somet"/>
</wf:ContextMenu.MenuItems>
</wf:ContextMenu>
</wf:ComboBox.ContextMenu>
</wf:ComboBox>
</Grid>
</Window>
using System.Windows;
using System.Windows.Controls;
namespace tete
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var child = myWFH.Child as System.Windows.Forms.ComboBox;
child.ContextMenu.MenuItems.Add(new System.Windows.Forms.MenuItem("my new menuitem"));
}
}
}