我有几个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
绑定设置为CanExecute
,以便当其为false时,MenuItem
具有IsEnabled=false
。这与在Visibility=Collapsed
时设置IsEnabled=false
的触发器进行,相反的情况也发生。我遇到的问题是,如果所有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# - 如何隐藏没有可见项目的ContextMenus?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28303623/