2012-04-20 80 views
3

我想使用trigger來自動隱藏MenuItem被禁用。如果我用我的風格特定MenuItem裏面這樣它的工作原理 -MenuItem觸發器不起作用

<MenuItem 
    Command="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type ContextMenu}}, 
         Path=PlacementTarget.DataContext.ExportCommand}" 
    Header="Export..."> 
    <MenuItem.Style> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Style.Triggers> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Setter Property="Visibility" Value="Collapsed" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </MenuItem.Style> 
</MenuItem> 

,但如果我把同樣的styleResourceDictionary這個樣子,那麼它不工作 -

<Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}" > 
    <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

我想對我所有的菜單項都有這種行爲,我不想在我的ContextMenu中的每個MenuItem上放置這種樣式。任何想法爲什麼它不工作?

+0

如果將Style放入ContextMenu.Resources中,它是否適用於MenuItems內部? – LPL 2012-04-20 16:47:50

回答

1

僅當樣式不具有x:Key集(http://msdn.microsoft.com/en-us/library/ms745683.aspx)時,樣式纔會自動應用於所有目標類型的實例。這是你的情況嗎?

+0

謝謝尼古拉,但事實並非如此。我已經嘗試過沒有x:Key了。 - 您的信息(來自您提供的鏈接) - ** TargetType屬性與x:Key屬性的關係**如第一個示例中所示,將TargetType屬性設置爲TextBlock而不指定樣式x:Key導致該樣式應用於所有TextBlock元素。 **在這種情況下,x:Key隱式設置爲{x:Type TextBlock} **。這意味着如果您明確地將x:Key值設置爲除{x:Type TextBlock} **之外的其他任何**值,則樣式不會自動應用於所有TextBlock元素._ – akjoshi 2012-04-20 12:14:42

1

這似乎工作。我剛剛嘗試過:

<Grid> 
<Grid.Resources> 
    <Style x:Key="{x:Type MenuItem}" TargetType="MenuItem" > 
    <Setter Property="OverridesDefaultStyle" Value="False" /> 
    <Setter Property="TextBlock.Foreground" Value="Blue" /> 
    <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </Style.Triggers> 
    </Style> 

</Grid.Resources> 

<TextBox Text="Hello!" IsReadOnly="True"> 
    <TextBox.ContextMenu> 
    <ContextMenu > 
     <MenuItem Header="Item1" /> 
     <MenuItem Header="Item2" IsEnabled="False"/> 
     <MenuItem Header="Item3" /> 
    </ContextMenu> 
    </TextBox.ContextMenu> 
</TextBox> 
</Grid>