我在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' 'Style'类型。 'DynamicResourceExtension'只能在a上设置 DependencyObject的DependencyProperty。
如果我尝试BasedOn="{StaticResource TriggerBase}"
,则会收到无法找到TriggerBase
的错误消息。以上链接的答案之一显示使用StaticResource
BasedOn="{StaticResource {x:Type FrameworkElement}
,但它仍然无法解析样式。
我如何从TriggerBase
风格继承?我的目标是.NET 4.5。
答案 0 :(得分:2)
你是对的,你可以将你的风格基于FrameworkElement
风格,只需要移动
<Style x:Key="TriggerBase" TargetType="{x:Type FrameworkElement}">
</Style>
到顶部然后
<Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource TriggerBase}">
将起作用