ContextMenu в WPF - PullRequest
       11

ContextMenu в WPF

13 голосов
/ 28 сентября 2011

Я новичок в WPF, хотя у меня есть некоторый опыт работы с WinForms. Я просто хочу добавить ContextMenu для нескольких объектов, которые я создаю динамически, но я не нашел компонента ContextMenu в наборе инструментов VS. Единственный способ, который я нашел, - это создать 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 в мою форму и очень быстро определять элементы и события без написания какого-либо кода. Возможно ли это в WPF?

Ответы [ 3 ]

30 голосов
/ 28 сентября 2011

Вы можете определить свой 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>
11 голосов
/ 28 сентября 2011

Кроме того, вы можете поместить команды в menuItem ...

Например:

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

CommandTarget может быть очень важным, если вы используете contextMenu для разных элементов управления.Я часто использую FindAncestor здесь, чтобы идентифицировать абонента.

2 голосов
/ 16 марта 2015

Следующий код работает для меня, InsertQuery / DeleteQuery - это два метода ICommand, определенные в ViewModel.

  <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...