不能以另一种风格为基础风格

时间:2014-01-30 11:06:47

标签: wpf xaml

我在Window.Resources中有一些本地定义的样式。我有一些TextBlockTextBoxCheckBoxRadioButton的样式。这些应该应用于窗口中的所有控件,因此我没有为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样式继承。在查看类似的问题后,例如thisthis,我仍然无法使其正常运行。这些答案建议您需要在我的基本样式上指定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。

1 个答案:

答案 0 :(得分:2)

你是对的,你可以将你的风格基于FrameworkElement风格,只需要移动

<Style x:Key="TriggerBase" TargetType="{x:Type FrameworkElement}">

</Style>

到顶部然后

<Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource TriggerBase}">

将起作用