67

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

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem Style="{StaticResource FooMenuItemStyle}"/>
    ...
</ContextMenu>

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

有什么方法可以将它们自动应用于子元素?这样你就可以简单地写这个:

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem/>
    ...
</ContextMenu>

如果 FooMenuStyle 可以设置包含 MenuItem 元素的样式,那就太好了,但这似乎是不可能的。

编辑: Menu 示例可能具有误导性,因为我不知道 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>
4

4 回答 4

170

只是为了完成原始答案,我认为在父级内部添加嵌套样式会更清楚:

<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>
于 2010-11-02T13:45:14.657 回答
30
<ContextMenu>
   <ContextMenu.Resources>
      <Style TargetType="{x:Type MenuItem}">
         <!--Setters-->
      </Style>
   </ContextMenu.Resources>
   <MenuItem/>
   <!--Other MenuItems-->
</ContextMenu>

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

于 2009-03-20T14:07:14.573 回答
5
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>
于 2009-03-20T14:27:18.893 回答
0

我完成此操作的方法是在全局资源字典中创建一个键控 ,然后仅将其应用于父元素。ResourceDictionary

在 app.xaml 中:

<Application.Resources>
  <ResourceDictionary>
    ...

    <ResourceDictionary x:Key="menuChildrenStyles">
      <Style TargetType="MenuItem">
        <!--Setters-->
      </Style>
    </ResourceDictionary>

    ...
  </ResourceDictionary>
</Application.Resources>

然后在您的其他 xaml 视图中:

<ContextMenu Resources="{StaticResource menuChildrenStyles}">
  <MenuItem />
  <MenuItem />
  <MenuItem />
  <MenuItem />
</ContextMenu>

这会将MenuItem样式应用于MenuItem父元素内的所有元素。

您还可以将其他样式添加到“menuChildrenStyles”字典中,例如 forTextBlock等。

于 2021-07-13T15:11:29.453 回答