c# - 如何隐藏没有可见项目的上下文菜单?

标签 c# wpf contextmenu

我有几个 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 时,MenuItemIsEnabled=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/

相关文章:

android - 如何在膨胀 View 上显示上下文菜单?

C# 鼠标右键单击和控制焦点

c# - 如何在静态变量完成之前获得通知

c# - 检索在 Func 中执行的调用方法的名称

c# - 根据传入的字符串值返回枚举常量

c# - 从ViewModel调用通用方法

wpf - 使用分组绑定(bind) WPF 中的列表框

android - onCreateContextMenu 未被调用

C# 项目不会出现在 ListView 中

wpf - 如何在 MaterialDesignInXamlToolkit 中添加个人图标?