【问题标题】:WPF Grouping formattings within a single styleWPF 在单个样式中对格式进行分组
【发布时间】:2026-02-11 05:50:01
【问题描述】:

我正在开发一个 WPF 应用程序,现在我拥有许多不同的资源字典,其中包含大量样式。其中许多样式描述了边框、背景等的画笔设置。到目前为止,每种格式都采用单独的样式。

但是,我想做的(如果可能的话)是将属于“父”样式的不同样式“分组”为“父”样式 - 从而能够更易于管理哪些样式涉及哪些控件。

例如,对于 GroupBox,设置最好以如下样式注册:

<Style x:Key="GroupBoxFormat">
    <Style.Resources>
        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" x:Key="ElementGradientBrush">
            <GradientStop Color="AntiqueWhite" Offset="0" />
            <GradientStop Color="Tan" Offset=".7" />
        </LinearGradientBrush>

        <Border x:Key="BorderFormat" BorderThickness="2">
            <Border.Background>
                <SolidColorBrush Color="Gold"></SolidColorBrush>
            </Border.Background>
            <Border.BorderBrush>
                <SolidColorBrush Color="Black" ></SolidColorBrush>
            </Border.BorderBrush>
        </Border>

        <FontFamily x:Key="TitleFontFamily">
            Arial
        </FontFamily>

        <FontWeight x:Key="TitleFontWeight">
            Bold
        </FontWeight>

        <!-- Other formats go here... -->

    </Style.Resources>
</Style>

如清单所示,样式中的所有单独资源都指定了 x:Key 属性。由于这似乎是必需的(如果缺少,VS 会抱怨),显然这肯定是有原因的。

从 XAML 代码的其他地方,可以使用 {StaticResource GroupBoxFormat} 引用样式。但是,如果我想从外部引用任何“内部”属性,例如“BorderFormat”,我该怎么做?类似于 C# 中的“点”符号,用于访问 SomeObject.SomeMember 等对象成员。停留在示例中,可以将其说明为“GroupBoxFormat.BorderFormat”。我只需要这样做的“XAML”方式。

【问题讨论】:

标签: c# wpf xaml formatting


【解决方案1】:

“C# 中的点表示法”与您所要求的完全不同。我唯一能建议的是在你的 App.xaml 中定义全局样式而不定义 Key 但定义 TargetType:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="3"/>
    <Setter Property="MinWidth" Value="110"/>
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="TextWrapping" Value="Wrap"/>
 </Style>

现在您的所有 TextBox 控件都将定义这些属性。如果您希望特定的 TextBox 具有不同的样式,则必须定义另一个 TextBox 样式,但设置 x:Key 属性以及 TargetType,然后引用 Key。

<TextBox Style{StaticResource YourKey}/>

【讨论】:

  • 感谢您的回复。也许我有点天真,但如果不能直接从外部“到达”样式中的内部属性,那么为每个元素分别设置“x:Key”规范有什么意义呢?它们显然是某些事情所必需的。
  • 我了解您通过使用此样式容器“GroupBoxFormat”然后在内部定义各个样式组件来实现的目标,但这不是正确的做事方式。您在&lt;Style.Resources&gt; 中定义的所有内容只能在“GroupBoxFormat”中使用,而不能在您的应用程序的其他地方使用。我建议查看这个关于样式化 GroupBox *.com/questions/9361903/styling-a-groupbox 的问题
  • 我明白了。感谢您的帮助。