2012-11-15 65 views
1

後,我有一個ContextMenu作爲一部分TabControl如:禁用上下文菜單不會消失右擊

<TabControl Name="MyTabControl"> 
    <TabControl.ContextMenu> 
     <ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True"> 
      <MenuItem Header="Item1"></MenuItem> 
      ... 
     </ContextMenu> 
    </TabControl.ContextMenu> 
</TabControl> 

正如你所看到的,菜單將被禁用。它將在稍後在程序中啓用,但現在應該保持禁用狀態。問題是,當我右鍵單擊TabControl並禁用菜單顯示時,它只是保持在第一次打開的位置,沒有其他右擊將移動它,也不會左鍵單擊某處使其消失。

擺脫它的唯一辦法,是無論是啓用它,然後左/右單擊,或通過使用MyContextMenu.Visibility = Visibility.Collapsed/Hidden;

我試過StaysOpen - 屬性設置爲False。然後菜單將在禁用狀態下打開一次。左擊消失後,即使啓用,也不會再出現。

唯一的解決辦法是改變StaysOpen屬性以及IsEnabled屬性,但是它有點奇怪,菜單在其禁用狀態下僅打開一次,然後不再有效。

我希望有人可以給我解釋一下,到底爲什麼被禁用的菜單不會關閉,並在虛假的財產StaysOpen使得它恰好打開一次,因爲它似乎是一個怪異的行爲給我。

+0

而不是將'ContextMenu'嘗試設置禁用爲空。顯示禁用上下文菜單有什麼用處? –

+0

當我將它設置爲null時,它只是「走了」不是嗎?我在WPF代碼中定義了菜單,因爲它非常簡單,直到程序中的某個點才需要它。想象一下,我在「TabControl」的一個選項卡中有某些項目,並且只想爲某些項目啓用菜單,但在程序開始時,任何選項卡中都沒有項目。 – phil13131

回答

0

看起來上下文菜單項的行爲很奇怪 - 你描述的是.Net 4.0,如果你的目標應用程序是.Net 3.5,你會發現相反的行爲 - 你不能如果單個項目被禁用,菜單將保持打開狀態,在右鍵單擊後立即消失。

但我認爲管理上下文菜單項的啓用狀態(以及它應該執行的OnClick操作)的最佳方式是Command

首先,你應該爲你的視圖指定一個datacontext,假設它是類ViewModel.cs。然後,通過實現ICommand接口,像這樣的東西創建一個命令:

public class MyCommand : ICommand 

然後你有一個CanExecute方法,也正是它的名字一樣 - 決定是否可以執行或者不執行命令。菜單項的啓用狀態也取決於此方法的返回值。因此,只要您需要,您可以保持它返回false,菜單將正確運行,菜單項將被禁用。然後,當你想要的時候,你可以讓它返回true(通過方法本身的一些邏輯),你將再次有一個正常工作的上下文菜單與啓用菜單項。

如果要禁用整個菜單,請使用相同的方法,但對於菜單。

如果您需要在禁用菜單中的所有項目(我認爲這是從整個菜單不同的),那麼你可以使用這樣的事情:

<TabControl Name="MyTabControl" Background="Green"> 
      <TabControl.ContextMenu> 
       <ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}"> 
        <ContextMenu.ItemTemplate> 
         <DataTemplate > 
          <MenuItem Header="{Binding Header}" IsEnabled="False" /> 
         </DataTemplate> 
        </ContextMenu.ItemTemplate> 
       </ContextMenu> 
      </TabControl.ContextMenu> 
     </TabControl> 

這裏您ItemsSourceItems)例如List<MenuItem>MenuItem itselw將是您的Model(MVVM中的每個菜單項)的模型,它們的屬性Header包含您希望在每個菜單項中看到的標題。與我的虛擬示例中的IsEnabled設置爲false不同,您可以將其綁定到屬性,以便控制它何時必須爲true和false。

+0

我希望你已經意識到,我不是禁用一個項目,而是整個菜單。因爲我偶爾會通過將'IsEnabled'-屬性設置爲false來完全禁用項目。 – phil13131

+0

好的,使用相同的方法爲菜單然後:) –

+0

看到我編輯的答案 –

相關問題