【问题标题】:Systray context menu - why are my commands not enabled?系统托盘上下文菜单 - 为什么我的命令未启用?
【发布时间】:2008-12-19 16:28:33
【问题描述】:

我正在创建一个 WPF 应用程序,并有一个带有上下文菜单的系统托盘图标。对于菜单项,我想使用 WPF 命令,但是当我分配它们时,即使在其他地方启用了(相同的)命令,它们也始终是灰色的。

MenuItem menuItem = new MenuItem();
menuItem.Header = "Exit";
menuItem.Command = CustomCommands.ExitApplication;
Systray.AddMenuItem(menuItem);

当我分配点击事件时它工作正常,并且我尝试为始终将 CanExecute 设置为 true 的命令创建 CanExecute 方法,但这也无济于事。有人知道为什么菜单项被禁用了吗?


更新:按照建议,我在上下文菜单中添加了一个命令绑定。这样做的效果是,它只有在您单击菜单后才起作用,即,起初菜单项是灰色的,但是一旦您单击菜单上的某个位置,选项就会启用。

为了解决这个问题,在我将菜单项添加到上下文菜单后,我调用了以下方法:

CommandManager.InvalidateRequerySuggested();

【问题讨论】:

    标签: wpf contextmenu command systray


    【解决方案1】:

    在我的脑海中,我猜您必须将 CommandBinding 添加到菜单或系统托盘,以便处理您的命令。虽然我认为如果是这种情况,它会默认启用。

    【讨论】:

      【解决方案2】:

      是的,我已经看到了这种情况。有时您必须告诉 WPF CommandManager 系统重新运行 CanExecute 方法。加载 ContextMenu 后尝试调用它:CommandManager.InvalidateQuerySuggested();

      【讨论】:

      • 谢谢,成功了。不过,方法名实际上是 InvalidateRequerySuggested()。
      【解决方案3】:

      我遇到了类似的问题。我觉得我的解决方案有点破解,但我真的无法解决这个问题。我正在使用自定义 DelegateCommand 实现,并且除上下文菜单中的项目外,取消/禁用按钮和菜单项都有效。所以,我所做的是处理 ContextMenuOpening 事件,然后将项目存储在临时变量中,调用 ContextMenu 中的 Clear 方法并立即重新添加项目。像魅力一样工作,但就像我说的那样,感觉“hacky”。它是这样的:

          private void ContextMenu_ContextMenuOpening (object sender, System.ComponentModel.CancelEventArgs e)
          {
              // HACK: For some reason items need to be removed and added back so that the command enablement requery works.
              var menu = sender as ContextMenu;
              if (menu == null) return;
      
              var menuItems = menu.Items.ToArray();
              menu.Items.Clear();
              foreach (var menuItem in menuItems)
                  menu.Items.Add(menuItem);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多