2012-04-20 2 views
3

Я хочу использовать trigger, чтобы автоматически скрыть MenuItem, который отключен. Если я использую мой стиль внутри определенной MenuItem, как это работает -MenuItem Trigger не работает

<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> 

, но если я помещаю же style в ResourceDictionary, как это, то он не работает -

<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> 

Я хочу иметь такое поведение для всех моих пунктов меню, и я не хочу ставить этот стиль на каждый MenuItem внутри моего ContextMenu. Любая идея, почему она не работает?

+0

Работает ли внутри MenuItems, если вы поместите стиль в ContextMenu.Resources? – LPL

ответ

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: Тип TextBlock} **, стиль не применяется ко всем элементам TextBlock автоматически. – akjoshi

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>