Пункт меню не показывает контекстное меню
У меня есть кнопка, которая при нажатии отображает ContextMenu. В этом ContextMenu у меня есть MenuItems. Если MenuItem щелкнуть левой кнопкой мыши, он должен выполнить команду. Все это поведение работает должным образом с помощью следующего кода:
<Button.ContextMenu>
<ContextMenu>
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding StartContextMenuCommand}" />
<Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
</Style>
</ContextMenu.ItemContainerStyle>
<MenuItem Header="{x:Static Name:ContextMenuStartNames.1}"/>
<MenuItem Header="{x:Static Name:ContextMenuStartNames.2}"/>
<MenuItem Header="{x:Static Name:ContextMenuStartNames.3}"/>
<MenuItem Header="{x:Static Name:ContextMenuStartNames.4}"/>
</ContextMenu>
</Button.ContextMenu>
Теперь я хочу, чтобы у каждого пункта меню было контекстное меню с одним MenuItem. Поскольку при щелчке левой кнопкой мыши вызывается команда в MenuItem, я хочу, чтобы при щелчке правой кнопкой мыши отображалось следующее ContextMenu:
<ContextMenu>
<MenuItem Header="Set Default"></MenuItem>
</ContextMenu>
Я попытался поместить это как сеттер в ItemContainerStyle. Я также попытался поместить его в качестве ContextMenu для MenuItem, но ни одна из моих попыток, среди прочего, не сработала. Я уверен, что мог бы придумать хакерский способ сделать это, но я хочу сохранить его в чистоте и простоте.
2 ответа
Вот мое текущее решение этой проблемы, но мне оно совсем не нравится. Я хотел бы избежать кода позади как можно больше.
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding StartCommand}" />
<Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu StaysOpen="True">
<MenuItem Header="Set As Default"/>
</ContextMenu>
</Setter.Value>
</Setter>
<EventSetter Event="PreviewMouseRightButtonUp" Handler="MenuItem_Click"/>
</Style>
</ContextMenu.ItemContainerStyle>
И код позади:
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
ButtonContextMenu.StaysOpen = true;
(sender as MenuItem).ContextMenu.IsOpen = true;
}
Может быть, я не понимаю ваш вопрос (мой английский не... ничего особенного):D Но это должно сработать, если вы просто хотите многоуровневое contextmenu:
<ContextMenu>
<MenuItem Header="Top Level 1">
<MenuItem Header="Sub Level" />
<MenuItem Header="Sub Level" />
</MenuItem>
<MenuItem Header="Top Level 2">
<MenuItem Header="Sub Level" />
<MenuItem Header="Sub Level" />
</MenuItem>
</ContextMenu>