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

47

我在研究WPF时想让窗口上的所有元素共享相同的边距。

我发现,所有能够拥有边距的控件都是从FrameworkElement派生的,因此我尝试了以下代码:

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

而且,这个不起作用。 我可以将其应用于所有按钮,但不能应用于从按钮派生的所有元素。 我有什么遗漏或者这根本不可能实现?

我是唯一一个觉得为WPF使用CSS会是一个好主意吗?


3
我知道这是一篇旧帖子,但你并不是唯一一个有这种想法的人。CSS并不完美,但使用比CSS更糟糕的东西肯定不是个好主意。 - Cool Blue
2个回答

65

很遗憾,您不能对基本的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>


1
谢谢。我也考虑过这个,但是如果我想将一个样式应用于窗口上的所有元素,它会感觉非常慢。 - Tigraine
5
在这里不起作用。我收到了一个XamlParseException,说目标类型与其他类型不匹配。我尝试在我的Button派生类和普通Button上使用它。 - ygoe
2
那么,有没有更好的方法将全局样式应用于应用程序中的所有控件? - Shimmy Weitzhandler
我想补充一点:如果TargetType是一个抽象类,WPF也不会应用该样式。 - mike

7
问题在于当搜索WPF样式时,它并不会搜索当前类所继承的所有类。但是,您可以为样式指定一个键,并将其应用于所有需要具有共同属性的元素。如果样式中指定了某个无法应用于正在进行样式设置的元素的属性,则该属性将被忽略。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接