我有几个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/

10-11 03:11