Systray上下文菜单 - 为什么我的命令未启用?

时间:2008-12-19 16:28:34

标签: wpf contextmenu command systray

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

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

当我分配点击事件并且我试图为命令创建CanExecute方法时它工作正常,它总是将CanExecute设置为true,但这也没有用。任何人都知道为什么禁用菜单项?


更新:根据建议,我添加了一个命令绑定到上下文菜单。这有效,但只有在您点击菜单后才会起作用,即,首先菜单项显示为灰色,但一旦您点击菜单上的某个位置,选项就会启用。

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

CommandManager.InvalidateRequerySuggested();

3 个答案:

答案 0 :(得分:3)

在我的头脑中,我猜你必须在Menu或systray中添加一个CommandBinding,以便处理你的命令。虽然我认为如果是这种情况,它将默认启用。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我有类似的问题。我觉得我的解决方案有点像黑客,但我真的无法解决这个问题。我正在使用自定义DelegateCommand实现,并且除了上下文菜单中的项目之外,ebabling /禁用按钮和菜单项都有效。所以,我所做的是处理ContextMenuOpening事件,然后将Items存储在temp变量中,在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);
    }