将样式的 TargetType 属性设置为基类

Posted

技术标签:

【中文标题】将样式的 TargetType 属性设置为基类【英文标题】:Setting a style's TargetType property to a base class 【发布时间】:2010-11-04 19:50:46 【问题描述】:

我只是在 WPF 中闲逛了一下,并希望我的 Window 上的所有元素共享相同的边距。 我发现所有能够有边距的控件都来自 FrameworkElement,所以我尝试了以下方法:

<Window.Resources>
<Style TargetType="x:Type FrameworkElement">
    <Setter Property="Margin" Value="10" />
</Style>
</Window.Resources>

而且,这不起作用。 我可以将此应用于所有按钮,但不能应用于从按钮派生的所有元素。 我错过了什么还是这根本不可能?

只有我一个人觉得将 CSS 用于 WPF 会是个好主意吗?

【问题讨论】:

我知道这是一篇旧帖子,但你不是唯一一个。 CSS 并不完美,但最好使用不比 CSS 的东西。 【参考方案1】:

很遗憾,您不能将样式应用于基本 FrameworkElement 类型;虽然 WPF 将允许您编写样式,但它不会将其应用于派生自它的控件。这似乎也适用于 FrameworkElement 的子类型,例如ButtonBase,Button/ToggleButton/RepeatButton的超类型。

您仍然可以使用继承,但您必须使用显式 BasedOn 语法将其应用到您希望应用到的控件类型。

<Window.Resources>
    <Style TargetType="x:Type FrameworkElement">
        <Setter Property="Margin" Value="10" />
    </Style>

    <Style TargetType="x:Type Label" BasedOn="StaticResource x:Type FrameworkElement" />
    <Style TargetType="x:Type TextBox" BasedOn="StaticResource x:Type FrameworkElement" />
    <Style TargetType="x:Type Button" BasedOn="StaticResource x:Type FrameworkElement" />

</Window.Resources>

【讨论】:

谢谢。我也想过这个问题,但是如果我想将一种样式应用于 Window 上的所有元素,那感觉太慢了。 在这里不起作用。我收到 XamlParseException 说 TargetType 与其他类型不匹配。我在我的 Button 派生类和普通 Button 上进行了尝试。 那么有没有更好的方法将全局样式应用于应用程序中的所有控件?【参考方案2】:

问题是在搜索样式时,WPF 不会搜索当前派生的所有类。但是,您可以为样式指定一个键并将其应用于您希望具有公共属性的所有元素。如果在样式中指定的属性无法应用于您正在设置样式的元素,则会被忽略。

【讨论】:

以上是关于将样式的 TargetType 属性设置为基类的主要内容,如果未能解决你的问题,请参考以下文章

将子类转换为基类?

如何将定义为基类的变量保存为 json?

将派生类转换为基类

将派生类转换为基类

无法将参数 1 从派生指针转换为基类指针引用

将指针从派生类转换为基类的最佳方法