2012-05-17 41 views
5

我有一个用户控制是这样的:如何在WPF中使用ContextMenu UserControl?

<UserControl x:Class="MyApp.UserControls.MyContextMenu" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      ContextMenuOpening="OnContextMenuOpening" 
      d:DesignHeight="300" d:DesignWidth="300"> 

    <UserControl.ContextMenu> 
     <ContextMenu> 
     ... 
     </ContextMenu> 
    </UserControl.ContextMenu> 
</UserControl> 

我的问题是:我怎么使用上下文菜单,就像一个数据网格:

<DataGrid ContextMenu="{usercontrols:MyContextMenu}" 

遗憾的是不工作,因为指定的值不正确,预计为ContextMenu

注意:我需要在几个地方重复使用我的上下文菜单,所以我把它放在它自己的文件中。另外,我需要能够听OnContextMenuOpening事件,因为在打开的菜单中需要做的关于菜肴的一些工作,而不是解雇上下文菜单黯然事件:http://connect.microsoft.com/VisualStudio/feedback/details/353112/contextmenu-opening-event-doesnt-fire-properly

“文本菜单本身是一个FrameworkElement派生类,但此 事件不会从正在打开的上下文菜单中产生,作为 源。事件由作为属性“拥有”上下文 菜单的元素引发,并且仅在用户尝试在UI中打开一个 上下文菜单。“

此事件问题是我为用户控件放置菜单的原因 - 以便用户控件可以获取事件并完成工作。

更新:我试图把它作为一个根元素和扩展的上下文菜单:

enter image description here

和代码隐藏:

enter image description here

但我得到:ContextMenu cannot have a logical or visual parent

回答

7

不管你如何调用你的UserControl,它不是一个ContextMenu。你将不得不从ContextMenu而不是用户控件来推导:

<ContextMenu x:Class="MyApp.MyContextMenu" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <MenuItem Header="Item 1"/> 
    <MenuItem Header="Item 2"/> 
    ... 
</ContextMenu> 

public partial class MyContextMenu : ContextMenu 
{ 
    public MyContextMenu() 
    { 
     InitializeComponent(); 
    } 
} 

但是,为什么要那样做呢?

+0

我很乐意提供建议。但是,你的工作不起作用,因为“ContextMenu不能有逻辑或可视的父母”。您不能将'ContextMenu'定义为根元素。 – Tower

+0

作为什么根元素?我只是从它衍生出来的,它的工作原理。 – Clemens

+0

不适合我。它抱怨'ContextMenu'不能有一个逻辑的或可视化的父亲。即,这意味着上下文菜单只能用于UI元素的ContextMenu属性值,而不能用作元素。这也有另一个问题:我不能听'OnContextMenuOpening'事件。 – Tower

3

尝试defineit,如:

<DataGrid.Resources> 
    <ContextMenu x:Key="DgContextMenu"> 
     ... 
    </ContextMenu> 
</DataGrid.Resources> 

,并在使用后它像

<DataGrid ContextMenu="{StaticResource DgContextMenu} 

应该工作。

+0

你是什么意思 - 我无法为它定义一个密钥,因为它是一个用户控件而不是资源,或者我可以吗? – Tower

+0

@rFactor:如果你想**完全使用**那个用户控件,如果是的话,你可以像静态资源一样定义菜单并在boh控件上使用它。 – Tigran