我们正在使用一些没有WPF等价的ActiveX或Windows窗体控件,所以我们自然会使用WindowsFormsHost来托管这些控件。我们通常使用一些常规控件(例如按钮来实现常用功能)来创建UserControl。一段xaml代码是这样的:
<WindowsFormsHost Name="windowsFormsHost1" >
<WindowsFormsHost.ContextMenu>
<ContextMenu>
<MenuItem Header="_Test1" />
</ContextMenu>
</WindowsFormsHost.ContextMenu>
<AxOWC:AxPivotTable x:Name="pivotTable" />
</WindowsFormsHost>
....
AxPivotTable是一个OWC(办公室Web组件)控件。在另一个UserControl中,我们在WindowsFormsHost中添加一个ReportViewer。请注意,即使没有我添加的任何ContextMenu项目,AxPivotTable或ReportViewer通常也有其默认的上下文菜单。
到目前为止,我的自定义ContextMenu尚未显示(仍然是默认显示的)。感谢this question,我发现我仍然需要在代码隐藏中捕获鼠标按下事件并设置
windowsFormsHost1.ContextMenu.IsOpen = True
显示contextmenu(虽然很奇怪)。
现在我的问题是,现在只有这个Test1 ContextMenu。默认的ContextMenu将不再显示。正如我所提到的,我们想要的是在这些默认上下文菜单之上添加自定义。
答案 0 :(得分:0)
这将是我的工作&#34;解决方案&#34;对于上面的示例,我不知道您是否也需要WindowsFormsHost
中的子元素。希望这会对你有所帮助
<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"));
}
}
}
修改强> 我希望现在它符合你的需要:)我正确理解你想做什么