Wpf Systray关联菜单-为什么未启用我的命令?

Wpf Systray关联菜单-为什么未启用我的命令?,wpf,contextmenu,command,systray,Wpf,Contextmenu,Command,Systray,我正在创建一个WPF应用程序,并且有一个带有上下文菜单的系统托盘图标。对于菜单项,我想使用WPF命令,但当我分配它们时,它们总是灰显,即使在其他地方启用了(相同)命令 MenuItem menuItem = new MenuItem(); menuItem.Header = "Exit"; menuItem.Command = CustomCommands.ExitApplication; Systray.AddMenuItem(menuItem); 当我分配单击事件时,它可以正常工作,并且我

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

MenuItem menuItem = new MenuItem();
menuItem.Header = "Exit";
menuItem.Command = CustomCommands.ExitApplication;
Systray.AddMenuItem(menuItem);
当我分配单击事件时,它可以正常工作,并且我尝试为命令创建一个CanExecute方法,该方法总是将CanExecute设置为true,但这也没有帮助。有人知道为什么菜单项被禁用了吗


更新:根据建议,我在上下文菜单中添加了一个命令绑定。这样做的效果是,它只能在您单击菜单后工作,即,最初菜单项变灰,但一旦您单击菜单上的某个位置,选项将变为启用状态

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

CommandManager.InvalidateRequerySuggested();

我猜你必须在菜单或系统中添加一个CommandBinding,这样你的命令才能得到处理。尽管我认为如果是这样的话,它会在默认情况下启用。

在我的头顶上,我猜你必须添加一个CommandBinding到菜单或systray中,以便处理你的命令。虽然我认为如果是这样的话,它将默认启用。

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

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

我也有类似的问题。我觉得我的解决方案有点困难,但我真的无法回避这个问题。我正在使用一个自定义的DelegateCommand实现,ebaling/disablebutton和菜单项可以工作,上下文菜单中的项目除外。因此,我所做的是处理ContextMenuOpening事件,然后将项目存储在一个临时变量中,调用ContextMenu中的Clear方法,然后立即重新添加项目。工作起来很有魅力,但就像我说的,感觉很“黑”。事情是这样的:

    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);
    }

我也有类似的问题。我觉得我的解决方案有点困难,但我真的无法回避这个问题。我正在使用一个自定义的DelegateCommand实现,ebaling/disablebutton和菜单项可以工作,上下文菜单中的项目除外。因此,我所做的是处理ContextMenuOpening事件,然后将项目存储在一个临时变量中,调用ContextMenu中的Clear方法,然后立即重新添加项目。工作起来很有魅力,但就像我说的,感觉很“黑”。事情是这样的:

    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);
    }

Thx,这就成功了。方法名实际上是invalidateRequestySuggested(),但是.Thx起了作用。但是,方法名称实际上是invalidateRequestySuggested()。