WPF中的ContextMenu

Mik*_*ike 13 c# wpf contextmenu

我是WPF的新手,虽然我有一些WinForms的经验.我只想为我动态创建的几个对象添加ContextMenu,但我在VS工具箱中找不到ContextMenu组件.我找到的唯一方法是在运行时创建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
Run Code Online (Sandbox Code Playgroud)

但是,在WinForms中,我可以将ContextMenuStrip组件放到我的表单中,并且可以非常快速地定义项目和事件,而无需编写任何代码.在WPF中有可能吗?

Sam*_*ich 30

您可以定义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>
Run Code Online (Sandbox Code Playgroud)

  • @Michael在WPF中,您的表单不是您的应用程序.你的数据是.这与WinForms完全不同,WinForms表单是您的应用程序,数据被添加到表单对象.在WPF中,您的数据就是您的应用程序,而您的表单对象只是一个允许用户与您的数据层交互的漂亮层.一旦你习惯了,WPF变得更容易:) (8认同)

Mar*_* B. 11

另外你可以把命令放在menuItem上......

像这样:

<MenuItem Header="MyContextMenuItem
                  Command="{Binding Path=MyCommand}"
                  CommandTarget="{Binding 
                              RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}">
Run Code Online (Sandbox Code Playgroud)

如果在不同的控件上使用contextMenu,CommandTarget可能非常重要.我经常在这里使用FindAncestor来识别调用者.