WPF Auto-assign 样式到 children 到 parent 样式

WPF Auto-assign styles to children through parent style

我的应用程序中有几个 StackPanels 希望他们的 children 应用某些样式:

<StackPanel.Resources>
    <Style TargetType="TextBlock" BasedOn="{StaticResource SettingLabel}" />
    <Style TargetType="DockPanel" BasedOn="{StaticResource SettingRow}" />
    <Style TargetType="CheckBox" BasedOn="{StaticResource SettingCheckBox}" />
    <Style TargetType="PasswordBox" BasedOn="{StaticResource DialogPasswordBox}" />
    <Style TargetType="TextBox" BasedOn="{StaticResource DialogTextBox}" />
</StackPanel.Resources>

我没有一遍又一遍地写这 5 行,而是给 StackPanel 本身一种应用这些样式的样式,从而减少冗余。

无法在样式 setter 中设置 Resources 因为它没有依赖性 属性:

<Style x:Key="SettingPanel" TargetType="StackPanel">
    <Setter Property="Resources">
        <Setter.Value>
            <Style TargetType="TextBlock" BasedOn="{StaticResource SettingLabel}" />
            <Style TargetType="DockPanel" BasedOn="{StaticResource SettingRow}" />
            <Style TargetType="CheckBox" BasedOn="{StaticResource SettingCheckBox}" />
            <Style TargetType="PasswordBox" BasedOn="{StaticResource DialogPasswordBox}" />
            <Style TargetType="TextBox" BasedOn="{StaticResource DialogTextBox}" />
        </Setter.Value>
    </Setter>
</Style>

那么有没有其他方法可以做到这一点,而不必在每个 child 上设置样式并重复 assignment 样式?

您可以在 StackPanelStyle.Resources 中定义样式。这些将应用于使用 SettingPanel 作为样式的 StackPanel 的所有子项。

<Style x:Key="SettingPanel" TargetType="StackPanel">
    <Style.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource SettingLabel}" />
            <Style TargetType="DockPanel" BasedOn="{StaticResource SettingRow}" />
            <Style TargetType="CheckBox" BasedOn="{StaticResource SettingCheckBox}" />
            <Style TargetType="PasswordBox" BasedOn="{StaticResource DialogPasswordBox}" />
            <Style TargetType="TextBox" BasedOn="{StaticResource DialogTextBox}" />
    </Style.Resources>
</Style>