Wpf 设置样式';将s TargetType属性设置为基类

Wpf 设置样式';将s TargetType属性设置为基类,wpf,styles,targettype,Wpf,Styles,Targettype,我只是在WPF中随便翻找了一下,希望我的窗口上的所有元素共享相同的边距。 我发现所有能够具有边距的控件都源自FrameworkElement,因此我尝试了以下方法: <Window.Resources> <Style TargetType="{x:Type FrameworkElement}"> <Setter Property="Margin" Value="10" /> </Style> </Window.Resources>

我只是在WPF中随便翻找了一下,希望我的窗口上的所有元素共享相同的边距。 我发现所有能够具有边距的控件都源自FrameworkElement,因此我尝试了以下方法:

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

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


我是唯一一个觉得在WPF中使用CSS是个好主意的人吗?

不幸的是,您无法将样式应用于基本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>


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

谢谢。我也考虑过,但如果我想将一种样式应用于窗口上的所有元素,那就太慢了。这里不行。我得到一个XamlParseException,说TargetType与其他类型不匹配。我在我的Button派生类和普通Button上试用了它。那么有没有更好的方法将全局样式应用于应用程序中的所有控件?我知道这是一篇老文章,但你不是唯一一个。CSS并不完美,但最好使用比CSS更糟糕的东西。