2011-09-28 63 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>