【问题标题】:Cannot base style on another style不能基于另一种风格的风格
【发布时间】:2014-01-30 11:06:46
【问题描述】:

我在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” “风格”类型。 “DynamicResourceExtension”只能设置在 DependencyObject 的 DependencyProperty。

如果我尝试BasedOn="{StaticResource TriggerBase}",我会收到一个错误,它找不到TriggerBase。上面链接的答案之一显示使用StaticResourceBasedOn="{StaticResource {x:Type FrameworkElement},但它仍然无法解析样式。

如何继承 TriggerBase 样式?我的目标是 .NET 4.5。

【问题讨论】:

  • 刚刚尝试了您的代码,我唯一要做的就是将 TriggerBase 样式移到顶部,然后 BasedOn="{StaticResource TriggerBase}" 工作
  • 成功了,谢谢。我没有意识到订购很重要。学过的知识。如果您想将其添加为一个,我会接受您的回答。

标签: wpf xaml


【解决方案1】:

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

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

</Style>

到顶部然后

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

会起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多