2008-12-19 36 views
1

我正在創建一個WPF應用程序,並有一個帶有上下文菜單的系統托盤圖標。對於我想使用WPF命令的菜單項,但是當我分配它們時,即使在其他地方啓用(相同)命令,它們也總是灰顯。系統托盤上下文菜單 - 爲什麼我的命令沒有啓用?

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

,當我點擊指定的事件和我試圖創造總是設置CanExecute爲true的命令CanExecute方法,但這並沒有幫助它工作正常。任何人都知道爲什麼菜單項被禁用?


更新:如上所述,我添加了一個命令綁定到上下文菜單。這樣做的效果是它可以工作,但只有在點擊菜單後,即首先菜單項變灰,但是一旦您在菜單上的某處點擊,選項就會啓用。

爲了解決這個問題,我叫下面,以後我添加的菜單項的快捷菜單:

CommandManager.InvalidateRequerySuggested(); 

回答

3

我的頭頂,我猜你有一個添加的CommandBinding到菜單或系統托盤,以便處理您的命令。雖然我認爲如果是這種情況,它會默認啓用。

2

是的,我見過這種情況。有時你必須告訴WPF CommandManager系統重新運行CanExecute方法。嘗試調用ContextMenu後加載:CommandManager.InvalidateQuerySuggested();

+1

Thx,這沒有把戲。雖然方法名實際上是InvalidateRequerySuggested()。 – 2008-12-19 22:43:20

0

我有類似的問題。我覺得我的解決方案有點破解,但我真的無法解決這個問題。我正在使用自定義的DelegateCommand實現,並且除了上下文菜單中的項目以外,還可以啓用/禁用按鈕和菜單項。所以,我所做的是處理ContextMenuOpening事件,然後將這些Items存儲在一個臨時變量中,在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); 
    }