我正在编写一个非常基本的 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。)
有什么想法为什么这不起作用吗?
最佳答案
每个控件在实例化时都会从显式定义的资源中获取其样式,或者查找可以获取默认样式的直接父级。在您的情况下,按钮控件将从平台获取其默认样式,因为您的应用程序尚未定义样式。现在,平台按钮样式无法了解您自定义的 Control 基本样式。因为只有当您显式定义 BasedOn
时,样式才会查找基本样式所以你只有两种方法 1. 为每个控件定义样式 - 我认为您不希望这样做。 2.为您感兴趣的控件定义Styles并设置BasedOn
<Style TargetType="{x:Type Control}">
<Setter Property="Margin" Value="20"/>
</Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Control}}">
</Style>
关于c# - 在控件类型上设置样式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1180267/