2011-09-28 94 views
13

我是WPF中的新成員,儘管我對WinForms有一些經驗。我只想爲我動態創建的幾個對象添加ContextMenu,但在VS工具箱中找不到ContextMenu組件。我發現的唯一方法是在運行時創建文本菜單是這樣的:WPF中的ContextMenu

ContextMenu pMenu = new ContextMenu(); 
MenuItem item1 = new MenuItem(); 
MenuItem item2 = new MenuItem(); 

//I have about 10 items 
//... 
item1.Header = "item1"; 
item1.Click += new RoutedEventHandler(item1_Click); 
pMenu.Items.Add(item1); 

item2.Header = "item2"; 
item2.Click += new RoutedEventHandler(item2_Click); 
pMenu.Items.Add(item2); 

//and so on 

但是,由於它的工作原理,在的WinForms我能的ContextMenuStrip組件拖放到自己的狀態並很快確定項目和活動W/O寫任何碼。在WPF中可能嗎?

回答

29

您可以定義ContextMenu資源並將其綁定到你需要的任何控制。檢查了這一點:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
     <ContextMenu x:Key="MyContextMenu"> 
      <MenuItem Header="Send" /> 
     </ContextMenu> 
    </Window.Resources> 
    <Grid> 
     <Button Name="a_button" 
      ContextMenu="{StaticResource MyContextMenu}" > 
     </Button> 
    </Grid> 
</Window> 
+1

好的,但我動態創建對象,所以如何在運行時綁定它? – Mike

+0

@邁克爾:你應該能夠通過'VAR pMenu =(文本菜單)this.Resources [「將myContextMenu」]得到的ContextMenu在運行時,'然後你可以這個變量分配到動態創建的控制。 – Heinzi

+0

謝謝,它的工作原理。我唯一不能理解的是爲什麼在WPF中我必須做所有這些魔術,並且在IDE中沒有適當的組件和GUI來讓事情變得更容易,因爲它們必須是。 – Mike

11

Additionaly你可以把在菜單項命令...

像這樣:

<MenuItem Header="MyContextMenuItem 
        Command="{Binding Path=MyCommand}" 
        CommandTarget="{Binding 
           RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type DataGrid}}}"> 

CommandTarget是非常重要的,如果你在不同的控件使用您的ContextMenu 。我經常在這裏使用FindAncestor來識別調用者。

+1

我使用PlacementTarget來獲取調用者 – Mike

1

下面的代碼對我的作品,InsertQuery/DeleteQuery在視圖模型定義了兩個ICommand的方法。

<DataGrid.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Insert" 
         Command="{Binding DataContext.InsertQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> 
      <MenuItem Header="Delete" 
         Command="{Binding DataContext.DeleteQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> 
     </ContextMenu> 
    </DataGrid.ContextMenu>