我有几个 ContextMenus,其中的项目是这样定义的:
<ContextMenu>
<MenuItem Header="Item 1" Command="{Binding Item1Command}"/>
<MenuItem Header="Item 2" Command="{Binding Item2Command}"/>
<MenuItem Header="Item 3" Command="{Binding Item3Command}"/>
</ContextMenu>
Command
绑定(bind)有 CanExecute
设置,因此当它为 false 时,MenuItem
有 IsEnabled=false
。当 IsEnabled=false
时,触发器会设置 Visibility=Collapsed
,反之亦然。我遇到的问题是,如果所有 MenuItem
都被禁用,ContextMenu
仍然显示为一个小的空白矩形。我有很多 ContextMenu
,那么实现它的最模块化方法是什么?
最佳答案
我最终采用了不同的解决方法,而不是隐藏 ContextMenu 的可见性。它似乎效率较低,因为它检查所有 FrameworkElement ContextMenus,但它正在工作:
EventManager.RegisterClassHandler(typeof(FrameworkElement), ContextMenuOpeningEvent,
new RoutedEventHandler(OnContextMenuOpening));
private void OnContextMenuOpening(object sender, RoutedEventArgs e)
{
var control = (sender as FrameworkElement);
var menu = control == null ? null : control.ContextMenu;
if (menu != null)
{
var items = menu.Items.Cast<MenuItem>();
if (items.All(i => i.Visibility != Visibility.Visible))
{
e.Handled = true;
}
}
}
如果有更好的方法在没有代码隐藏的情况下执行此操作,那么对于父控件,我愿意接受其他解决方案。
关于c# - 如何隐藏没有可见项目的上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28303623/