【问题标题】:MenuItem Trigger not working菜单项触发器不起作用
【发布时间】:2012-04-20 11:11:06
【问题描述】:

我想使用trigger 自动隐藏已禁用的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>

但是如果我像这样将相同的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>

我希望我的所有菜单项都有这种行为,我不想在我的ContextMenu 中的每个MenuItem 上都使用这种样式。知道为什么它不起作用吗?

【问题讨论】:

  • 如果您将样式放入 ContextMenu.Resources,它是否适用于 MenuItems 内部?

标签: .net wpf triggers menuitem resourcedictionary


【解决方案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>

【讨论】:

    【解决方案2】:

    只有在没有设置x:Key (http://msdn.microsoft.com/en-us/library/ms745683.aspx) 时,样式才会自动应用于目标类型的所有实例。这是你的情况吗?

    【讨论】:

    • 感谢 Nikolay,但事实并非如此。我也尝试过不使用 x:Key。对于您的信息(来自您提供的链接) - TargetType 属性和 x:Key 属性的关系 如第一个示例所示,将 TargetType 属性设置为 TextBlock 而不分配样式x:Key 使样式应用于所有 TextBlock 元素。 在这种情况下,x:Key 被隐式设置为 {x:Type TextBlock}。这意味着如果您将 x:Key 值显式设置为 除 {x:Type TextBlock} 之外的任何值,则样式不会自动应用于所有 TextBlock 元素。
    猜你喜欢
    • 2021-06-13
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2018-10-17
    相关资源
    最近更新 更多