【发布时间】:2014-01-30 11:06:46
【问题描述】:
我在Window.Resources 中有一些本地定义的样式。我有一些TextBlock、TextBox、CheckBox 和RadioButton 的样式。这些应该应用于窗口中的所有控件,所以我没有为x:Key 提供值。我希望他们继承定位FrameworkElement 的风格。所以我有类似的东西:
<Style TargetType="{x:Type RadioButton}">
...
</Style>
<Style TargetType="{x:Type TextBlock}">
...
</Style>
<Style TargetType="{x:Type TextBox}">
...
</Style>
<Style TargetType="{x:Type CheckBox}">
...
</Style>
<Style x:Key="TriggerBase" TargetType="{x:Type FrameworkElement}">
<Style.Triggers>
<Trigger Property="UIElement.IsMouseOver" Value="True">
...
</Trigger>
</Style.Triggers>
</Style>
我的问题是我无法将BasedOn 属性设置为从我的TriggerBase 样式继承。在查看了类似的问题后,例如this 和this,我仍然无法正常工作。这些答案表明您需要在基本样式上指定TargetType,我已经这样做了。
我认为样式可能必须针对完全相同的类型,但在对 MSDN 进行挖掘之后,我发现这不是问题:
如果您创建具有 TargetType 属性的样式并将其基于另一个也定义了 TargetType 属性的样式,则派生样式的目标类型必须与基本样式的类型相同或派生自该类型。
如果我将BasedOn 设置为BasedOn="{DynamicResource TriggerBase}",它可以找到我的TriggerBase,但我收到一条错误消息:
不能在“BasedOn”属性上设置“DynamicResourceExtension” “风格”类型。 “DynamicResourceExtension”只能设置在 DependencyObject 的 DependencyProperty。
如果我尝试BasedOn="{StaticResource TriggerBase}",我会收到一个错误,它找不到TriggerBase。上面链接的答案之一显示使用StaticResource 像BasedOn="{StaticResource {x:Type FrameworkElement},但它仍然无法解析样式。
如何继承 TriggerBase 样式?我的目标是 .NET 4.5。
【问题讨论】:
-
刚刚尝试了您的代码,我唯一要做的就是将
TriggerBase样式移到顶部,然后BasedOn="{StaticResource TriggerBase}"工作 -
成功了,谢谢。我没有意识到订购很重要。学过的知识。如果您想将其添加为一个,我会接受您的回答。