Контекстное меню

Класс ContextMenu представляет элемент, который предоставляет функциональные возможности, используя контекстно-специфичный Menu. Компонент ContextMenu прикреплен к определенному элементу управления и позволяет вам предоставить пользователям список элементов, которые перечисляют команды или параметры, связанные с этим элементом управления, например Button.

Обычно пользователи открывают ContextMenu в пользовательском интерфейсе с помощью правой кнопки мыши. Когда пользователи щелкают правой кнопкой мыши на элементе управления, открывается меню. Нажатие MenuItem кнопки обычно открывает подменю или приводит к выполнению команды приложением.

Снимок экрана: ContextMenu в состояниях по умолчанию и открытых состояниях.

Создание ContextMenu

Вы можете создать ContextMenu, объявив его в XAML или программно в коде.

В следующем примере показано, как объявить контекстное меню в XAML:

<Button Name="cmButton" Height="30" Width="200">
    Button with Context Menu
    <Button.ContextMenu>
        <ContextMenu Name="cm" Opened="Menu_OnOpened" Closed="Menu_OnClosed" StaysOpen="true">
            <MenuItem Header="File"/>
            <MenuItem Header="Save"/>
            <MenuItem Header="SaveAs"/>
            <MenuItem Header="Recent Files">
                <MenuItem Header="ReadMe.txt"/>
                <MenuItem Header="Schedule.xls"/>
            </MenuItem>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

В следующем примере показано, как создать контекстное меню программным способом в коде:

private void CreateContextMenuProgrammatically()
{
    Button button = new() { Content = "Created with C#" };
    ContextMenu contextMenu = new();
    button.ContextMenu = contextMenu;

    MenuItem fileMenuItem = new() { Header = "File" };
    MenuItem newMenuItem = new() { Header = "New" };
    fileMenuItem.Items.Add(newMenuItem);

    MenuItem openMenuItem = new() { Header = "Open" };
    fileMenuItem.Items.Add(openMenuItem);

    MenuItem recentlyOpenedMenuItem = new() { Header = "Recently Opened" };
    openMenuItem.Items.Add(recentlyOpenedMenuItem);

    MenuItem textFileMenuItem = new() { Header = "Text.xaml" };
    recentlyOpenedMenuItem.Items.Add(textFileMenuItem);

    contextMenu.Items.Add(fileMenuItem);

    // Add the button to your container (implementation depends on your layout)
    // containerPanel.Children.Add(button);
}
Private Sub CreateContextMenuProgrammatically()
    Dim button As New Button() With {.Content = "Created with Visual Basic"}
    Dim contextMenu As New ContextMenu()
    button.ContextMenu = contextMenu

    Dim fileMenuItem As New MenuItem() With {.Header = "File"}
    Dim newMenuItem As New MenuItem() With {.Header = "New"}
    fileMenuItem.Items.Add(newMenuItem)

    Dim openMenuItem As New MenuItem() With {.Header = "Open"}
    fileMenuItem.Items.Add(openMenuItem)

    Dim recentlyOpenedMenuItem As New MenuItem() With {.Header = "Recently Opened"}
    openMenuItem.Items.Add(recentlyOpenedMenuItem)

    Dim textFileMenuItem As New MenuItem() With {.Header = "Text.xaml"}
    recentlyOpenedMenuItem.Items.Add(textFileMenuItem)

    contextMenu.Items.Add(fileMenuItem)

    ' Add the button to your container (implementation depends on your layout)
    ' containerPanel.Children.Add(button)
End Sub

Применение стилей к ContextMenu

Используя управляющий элемент Style, можно значительно изменить внешний вид и поведение ContextMenu без написания пользовательского контрола. Визуальные свойства можно задать и применить стили к частям элемента управления. Например, можно изменить поведение частей элемента управления, воспользовавшись свойствами, и добавить в него новые части, или изменить макет элемента управления ContextMenu. В следующих примерах показано несколько способов добавления стилей в ContextMenu элементы управления.

В первом примере определяется стиль, называемый SimpleSysResources, который показывает, как использовать текущие параметры системы в вашем стиле. Пример назначает MenuHighlightBrushKey как Background цвет и MenuTextBrushKey как Foreground цвет для ContextMenu.

<Style x:Key="SimpleSysResources" TargetType="{x:Type MenuItem}">
  <Setter Property = "Background" Value=
    "{DynamicResource {x:Static SystemColors.MenuHighlightBrushKey}}"/>
  <Setter Property = "Foreground" Value=
    "{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"/>
</Style>

В следующем примере элемент Trigger используется для изменения внешнего вида Menu в ответ на события, вызванные на ContextMenu. Когда пользователь перемещает указатель мыши в меню, внешний вид ContextMenu элементов изменяется.

<Style x:Key="Triggers" TargetType="{x:Type MenuItem}">
  <Style.Triggers>
    <Trigger Property="MenuItem.IsMouseOver" Value="true">
      <Setter Property = "FontSize" Value="16"/>
      <Setter Property = "FontStyle" Value="Italic"/>
      <Setter Property = "Foreground" Value="Red"/>
    </Trigger>
  </Style.Triggers>
</Style>

Стили и шаблоны

В этом разделе описываются стили и шаблоны элемента ContextMenu управления. Вы можете изменить значение по умолчанию ControlTemplate , чтобы предоставить элементу управления уникальный внешний вид. Дополнительные сведения см. в статье "Стили и шаблоны" и"Создание шаблона" для элемента управления.

Свойство контента

Элемент управления ContextMenu использует свойство Items как свойство содержимого, которое содержит пункты меню, отображаемые в контекстном меню.

Комплектующие

Элемент ContextMenu управления не определяет именованные части шаблона.

При создании ControlTemplate для ContextMenu ваш шаблон может содержать ItemsPresenter внутри ScrollViewer. ItemsPresenter отображает каждый элемент в ContextMenu, а ScrollViewer включает прокрутку внутри элемента управления. Если ItemsPresenter не является прямым дочерним элементом ScrollViewer, необходимо задать для ItemsPresenter имя ItemsPresenter.

Визуальные состояния

В следующей ContextMenu таблице перечислены визуальные состояния элемента управления.

Имя визуального состояния Имя группы визуальных состояний Description
Действительный ValidationStates Элемент управления действителен и не имеет ошибок проверки.
НедействительныйФокус ValidationStates Элемент управления имеет ошибку проверки и находится в фокусе клавиатуры.
НедействительныйНефокусированный ValidationStates Элемент управления имеет ошибку проверки, но не имеет фокуса клавиатуры.

См. также