设置 WPF 用户控件的样式
Posted
技术标签:
【中文标题】设置 WPF 用户控件的样式【英文标题】:Setting the style of a WPF UserControl 【发布时间】:2016-07-05 02:03:34 【问题描述】:我知道我可以通过添加属性在控件中设置UserControl
的样式:
Style="StaticResource MyStyle"
并且在我的ResourceDictionary
中具有如下所示的样式:
<Style x:Key="MyStyle" TargetType="x:Type UserControl">
<Style.Resources>
<Style TargetType="Label">
<!-- Label Setters -->
</Style>
<Style TargetType="TextBox">
<!-- TextBox Setters -->
</Style>
</Style.Resources>
</Style>
但是有没有办法可以直接在ResourceDictionary
中设置UserControl
的样式,例如:
<Style x:Key="MyStyle" TargetType="x:Type MyControl">
基本上我的问题是,我可以将样式直接应用于控件而不是控件组件吗?
编辑: 我想要完成的是以下内容:
<Style x:Key="MyStyle" TargetType="x:Type MyControl">
<Setter Property="Background" Value="Black"/>
</Style>
<Style x:Key="x:Type MyControl" TargetType="x:Type MyControl" BasedOn="StaticResource MyStyle"/>
第二行将样式应用于应用程序中的所有控件,如果您对普通控件执行类似操作,则此方法有效。
但是这只会设置UserControl
的Background
,所以我如何将相同的背景应用到它的组件上。
我该如何使用UserControl
?
【问题讨论】:
【参考方案1】:您可以像这样直接设置 UserControl 的样式:
<UserControl x:Class="MyNamespace.MyControl" xmlns:local="MyNamespace" ...>
<UserControl.Style>
<Style>
<Setter Property="local:MyControl.MyProperty" Value="..."/>
...
</Style>
</UserControl.Style>
</UserControl>
或者像这样:
<UserControl x:Class="MyNamespace.MyControl" xmlns:local="MyNamespace" ...>
<UserControl.Style>
<Style TargetType="local:MyControl">
<Setter Property="MyProperty" Value="..."/>
...
</Style>
</UserControl.Style>
</UserControl>
用户控件资源中的默认样式也应该可以工作:
<UserControl x:Class="MyNamespace.MyControl" xmlns:local="MyNamespace" ...>
<UserControl.Resources>
<Style TargetType="local:MyControl">
<Setter Property="MyProperty" Value="..."/>
...
</Style>
</UserControl.Resources>
</UserControl>
【讨论】:
但我想在 ResourceDictionary 中设置它而不是在控件本身中 在您的所有建议中,您是在 UserControl 而不是 ResourceDictionary 中设置样式 第三个例子在UserControl.Resources
,它是一个ResourceDictionary。您当然可以将其放在任何其他 ResourceDictionary 中,例如Application.Resources
.
查看我的编辑,我试图完全不更改 UserControl【参考方案2】:
您需要从定义的样式中删除x:Key
,以便它可以普遍应用于与TargetType
中定义的相同类型的所有控件。
引用MSDN for Style.TargetType Property:
将 TargetType 属性设置为 TextBlock 类型而不设置 x:Key 会将 x:Key 隐式设置为 x:Type TextBlock。 这也意味着如果你给 [...] Style 一个 x:Key 值而不是 x:Type TextBlock,则 Style 不会自动应用于所有 TextBlock 元素。相反,您需要将样式显式应用于 TextBlock 元素。
【讨论】:
总是简单的事情。有没有办法将UserControl
背景应用于其组件,即标签,而不必像我在示例中所做的那样设置Style.Resources
?
有趣的是,Background 依赖属性Inherits
元数据没有设置为true
,但默认值为Brushes.Transparent
。 IOW:除非组成控件的背景明确定义为内联或隐式覆盖(就像您对自定义控件所做的那样),否则您应该没问题,不需要进一步更改。
所以因为我设置了Label
样式,所以我需要在Style.Resources
元素中设置样式来覆盖它?
例如,我有类似<Style TargetType="x:Type Label">
的样式,这是否意味着我必须覆盖 UserControl 样式中的标签样式才能添加我自己的值?就像我已经在做的那样。【参考方案3】:
针对特殊情况的死灵答案。如果通过另一个 WPF 控件或窗口中的 DataTemplate 资源选择了用户控件,则 WPF 可能不会自动应用导入的资源字典中的默认样式。但是,您可以在导入资源字典后应用命名样式资源。
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Resources/ResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.Style>
<Binding Source="StaticResource MyUserControlStyle"></Binding>
</UserControl.Style>
【讨论】:
当您使用静态资源时,Binding 也应该有 Mode=OneTime。 @CBFT 很高兴知道!【参考方案4】:要设置所有控件的样式,请将 ResourceDictionary 添加到 App.xaml 的资源中。
<Application.Resources>
<!-- Your Resources for the whole application here -->
</Application.Resources>
如果您使用应用程序打开主窗口...
<Application ...
MainWindow="MainWindow">
或在启动事件期间...
<Application ...
MainWindow="MainWindow">
Startup="Application_Startup">
这些资源在 MainWindow 的每个控件中都可用。
要设置特定用户控件的样式,请看这里: Set Style for user control
【讨论】:
我知道我可以做到,我的问题是如何为控件创建样式而不是如何将资源字典添加到应用程序【参考方案5】:在您的用户控件 xaml 中,将样式放在资源标签内:
<UserControl>
<UserControl.Resources>
<Style ...</Style>
</UserControl.Resources>
//.. my other components
</UserControl>
【讨论】:
以上是关于设置 WPF 用户控件的样式的主要内容,如果未能解决你的问题,请参考以下文章