45

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

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

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

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

4

2 回答 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>

于 2009-06-22T13:28:19.433 回答
7

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

于 2009-09-24T03:44:56.370 回答