2012-05-17 62 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