【发布时间】:2019-03-17 09:55:28
【问题描述】:
WPF。考虑以下带有模板的样式,以及它如何影响MenuItem 上的填充。 (这些是从http://materialdesigninxaml.net/ github 中MaterialDesignThemes.Wpf 的MaterialDesignTheme.Menu.xaml 中的样式中提取的与填充相关的行。)
<Style TargetType="{x:Type MenuItem}" x:Key="MaterialDesignMenuItem" BasedOn="{x:Null}">
<Setter Property="Padding" Value="24 0"></Setter>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<ControlTemplate.Resources>
</ControlTemplate.Resources>
<Grid ClipToBounds="True">
</Grid>
<ControlTemplate.Triggers>
<!--#region Roles Triggers -->
<Trigger Property="Role" Value="TopLevelHeader">
<Setter Property="Padding" Value="16 0"/>
</Trigger>
<Trigger Property="Role" Value="TopLevelItem">
<Setter Property="Padding" Value="16 0"/>
</Trigger>
<!--#endregion-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
很容易覆盖默认的填充线
<Setter Property="Padding" Value="24 0"></Setter>
像这样:
<Style TargetType="MenuItem" BasedOn="{StaticResource MaterialDesignMenuItem}">
<Setter Property="Padding" Value="4 0"></Setter>
</Style>
我还没有找到,是如何定义两个 TopLevel... 触发器,以便可以覆盖它们的公共填充值 "16 0"。
在实际代码中,这些触发器做的更多,所以我不想完全覆盖触发器;我必须复制其余的触发代码。
我想让原始样式为这些指定一个默认值,我可以覆盖它。比如:
<Style TargetType="{x:Type MenuItem}" x:Key="MaterialDesignMenuItem" BasedOn="{x:Null}">
<Setter Property="Padding" Value="24 0"></Setter>
<Setter Property="TopPadding" Value="16 0"></Setter>
...
然后覆盖:
<Style TargetType="MenuItem" BasedOn="{StaticResource MaterialDesignMenuItem}">
<Setter Property="Padding" Value="4 0"></Setter>
<Setter TopPadding="Padding" Value="4 0"></Setter>
</Style>
当然,MenuItem 上没有“TopPadding”属性,所以这不会编译。
如何在原始样式中创建这个新属性,在模板中引用它 - 在两个触发器中,然后在我的自定义样式中覆盖它?
可能相关的答案:
Bind to resource keys on each item
Bind to attached property
最坏的情况,我可以将 MenuItem 子类化,并制作一个仅适用于该子类的模板(添加“TopPadding”属性)。我不想那样做,因为这是一个复杂库的一部分;我想要一个可以与任何 MenuItem 一起使用的模板。我认为这意味着任何附加属性都必须是可选的(MenuItem 可能没有它。)我不确定模板如何引用附加属性,也不确定如果缺少它如何设置默认值。
重要提示:我不想要使用 Tag 属性的 hack;我想要一种可扩展的方法,以某种方式添加适当的属性或资源。
更新
我刚刚找到this answer;我没有意识到附加属性不必在原始类中定义 - 可以在没有子类化 MenuItem 的情况下定义一个。
我不清楚是否可以设置 default 值以防此附加属性丢失,但我现在正在尝试这样做。
【问题讨论】:
标签: wpf triggers controltemplate