在控件类型上设置样式不起作用

时间:2009-07-24 21:33:13

标签: c# .net wpf xaml styles

我正在编写一个非常基本的WPF对话框,并希望将一个简单的样式应用于从Control类继承的所有对象。我正在使用的代码:

<Window.Resources>
    <Style TargetType="{x:Type Control}">
        <Setter Property="Margin" Value="20"/>
    </Style>
</Window.Resources>
 <StackPanel>
    <TextBlock Text="some text"/>
    <TextBox x:Name="x_NameTextBox"/>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
        <Button x:Name="x_CancelButton" Click="x_CancelButton_Click" Content="Cancel"/>
        <Button x:Name="x_OkButton" Click="x_OkButton_Click" Content="OK"/>
    </StackPanel>
</StackPanel>
</Window>

上面定义的样式根本不会改变窗口的布局,除非我指定一个键并在每个单独的对象上设置样式,这正是我想要避免的。它也适用于更具体的类型(例如,将TargetType设置为Button。)

为什么这不起作用的任何想法?

1 个答案:

答案 0 :(得分:3)

每个控件在实例化时都会从显式定义的资源中获取其Style,或者查找可以获取默认样式的直接父级。在您的情况下,Button控件将从平台获取其默认样式,因为您的应用程序尚未定义一个。现在,该平台按钮样式无法了解您的自定义控制基本样式。因为样式只有在您明确定义 BasedOn

时才会查找基本样式

所以你只有两种方式 1.为每个控件定义样式 - 你不想让我想到。 2.为您感兴趣的控件定义样式并设置BasedOn

<Style TargetType="{x:Type Control}">
    <Setter Property="Margin" Value="20"/>
</Style>

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Control}}">
</Style>