1

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

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

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


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

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

CommandManager.InvalidateRequerySuggested();
4

3 回答 3

3

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

于 2008-12-19T17:23:45.130 回答
2

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

于 2008-12-19T22:36:09.087 回答
0

我有一个类似的问题。我觉得我的解决方案有点破解,但我真的无法解决这个问题。我正在使用自定义 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);
    }
于 2013-06-09T19:24:21.320 回答