2012-04-20 77 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>