我正在编写一个非常基本的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。)
为什么这不起作用的任何想法?
答案 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>