在WPF中设置嵌套元素的样式

gix*_*gix 60 wpf styles children nested

假设您有一个嵌套的元素结构,例如带有MenuItems的ContextMenu:

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem Style="{StaticResource FooMenuItemStyle}"/>
    ...
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将样式或模板应用于ContextMenu或MenuItem元素.但是如果MenuItem样式属于Menu样式,则将它添加到每个MenuItem元素是非常麻烦和冗余的.

有没有办法自动将这些应用于子元素?所以你可以简单地写这个:

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem/>
    ...
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)

如果FooMenuStyle可以包含包含MenuItem元素的样式,那将是很好的,但这似乎是不可能的.

编辑:菜单示例可能会产生误导,因为我不知道ItemContainerStyle,并且意图是一般解决方案.基于这两个答案,我提出了两个解决方案:一个常规变体和一个ItemContainerStyle等:

<Style x:Key="FooMenuItem" TargetType="{x:Type MenuItem}">
    ...
</Style>

<Style x:Key="FooMenu" TargetType="{x:Type ContextMenu}">
    <!-- Variant for specific style attribute -->
    <Setter Property="ItemContainerStyle"
            Value="{StaticResource FooMenuItem}"/>

    <!-- General variant -->
    <Style.Resources>
        <Style TargetType="{x:Type MenuItem}"
               BasedOn="{StaticResource FooMenuItem}"/>
    </Style.Resources>
</Style>

<ContextMenu Style="{StaticResource FooMenu}">
    <MenuItem/>
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)

Jua*_*ero 143

只是为了完成原来的答案,我想这是更清晰添加嵌套样式像父里面:

<Style x:Key="WindowHeader" TargetType="DockPanel" >
    <Setter Property="Background" Value="AntiqueWhite"></Setter>
    <Style.Resources>
        <Style TargetType="Image">
            <Setter Property="Margin" Value="6"></Setter>
            <Setter Property="Width" Value="36"></Setter>
            <Setter Property="Height" Value="36"></Setter>
        </Style>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap"></Setter>
        </Style>
    </Style.Resources>
</Style>
Run Code Online (Sandbox Code Playgroud)

  • 这是最合适的答案.没有在网上哪里可以罚款.你摇滚!谢谢. (7认同)
  • 谢谢,这个信息真的很难找到. (3认同)

Jos*_*h G 21

<ContextMenu>
   <ContextMenu.Resources>
      <Style TargetType="{x:Type MenuItem}">
         <!--Setters-->
      </Style>
   </ContextMenu.Resources>
   <MenuItem/>
   <!--Other MenuItems-->
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)

该样式将应用于ContextMenu中的所有MenuItem对象.

  • 我认为他的资源已经有了一种风格,并希望将它应用于子项目,而不是再次重申它. (4认同)

Ken*_*art 5

<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)