假设您有一个嵌套的元素结构,例如带有MenuItems的ContextMenu:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem Style="{StaticResource FooMenuItemStyle}"/>
...
</ContextMenu>
您可以轻松地将样式或模板应用于ContextMenu或MenuItem元素。但是如果MenuItem样式属于Menu样式,那么将它添加到每个MenuItem元素是非常麻烦和多余的。
有没有办法自动将这些应用于子元素?所以你可以简单地写一下:
<ContextMenu Style="{StaticResource FooMenuStyle}">
<MenuItem/>
...
</ContextMenu>
如果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>
答案 0 :(得分:131)
只是为了完成原始答案,我认为在父母中添加嵌套样式更清晰:
<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>
答案 1 :(得分:22)
<ContextMenu>
<ContextMenu.Resources>
<Style TargetType="{x:Type MenuItem}">
<!--Setters-->
</Style>
</ContextMenu.Resources>
<MenuItem/>
<!--Other MenuItems-->
</ContextMenu>
该样式将应用于ContextMenu中的所有MenuItem对象。
答案 2 :(得分:6)
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
<MenuItem/>
</ContextMenu>
答案 3 :(得分:0)
我完成此操作的方法是在全局资源字典中创建一个 keyed ResourceDictionary
inside,然后仅将其应用于父元素。
在 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”字典中,例如 TextBlock
等。