我正在创建一个WPF应用程序,并且系统托盘图标带有上下文菜单。对于我想要使用WPF命令的菜单项,但是当我分配它们时,即使在其他地方启用(相同)命令,它们也总是显示为灰色。
MenuItem menuItem = new MenuItem();
menuItem.Header = "Exit";
menuItem.Command = CustomCommands.ExitApplication;
Systray.AddMenuItem(menuItem);
当我分配点击事件并且我试图为命令创建CanExecute方法时它工作正常,它总是将CanExecute设置为true,但这也没有用。任何人都知道为什么禁用菜单项?
更新:根据建议,我添加了一个命令绑定到上下文菜单。这有效,但只有在您点击菜单后才会起作用,即,首先菜单项显示为灰色,但一旦您点击菜单上的某个位置,选项就会启用。
为了解决这个问题,我在将菜单项添加到上下文菜单后调用了以下内容:
CommandManager.InvalidateRequerySuggested();
答案 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);
}