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

标签 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。)

有什么想法为什么这不起作用吗?

最佳答案

每个控件在实例化时都会从显式定义的资源中获取其样式,或者查找可以获取默认样式的直接父级。在您的情况下,按钮控件将从平台获取其默认样式,因为您的应用程序尚未定义样式。现在,平台按钮样式无法了解您自定义的 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/

相关文章:

.net - 通过依赖注入(inject)解决循环依赖

c# - BindingExpression 路径错误 : property not found on 'object'

c# - 是否可以重新启动 IConnectableObservable?

c# - C# 中 "With...End With"的等价性?

.net - 如何在不使用性能监视器的情况下以编程方式确定硬盘事件

.net - 如何获得图像中的多数颜色?

c# - 如何使用 MVVM 绑定(bind)多个数据网格源?

wpf - 限制附加依赖属性范围的约束

c# - 如何提高加载大量记录到 WPF 下拉列表的性能?

c# - 在 Windows 应用商店应用程序中组合位图图像的最简单方法是什么