容器内的隐式样式

Implicit Style Within Container

我想将 Padding="0" 应用于左侧边栏(第一个 StackPanel)上的每个 Label,以便它与每个 TextBox(以及其他控制)。

如何在 <ApplicationResources> 中定义仅适用于特定容器内元素的隐式样式?

备选方案:

  1. 使用x:Key="sidebarLabel"。然而,这个选项对于我实际应用的侧边栏中的许多标签来说似乎是多余的。
  2. Padding=0 添加到边栏中的每个 Label。这与之前的替代方案基本相同。
  3. 将隐式样式移至 <StackPanel.Resources>。但是,我想将样式(在 App.xaml 中)与 XAML(在 MainWindow.xaml 中)分开。

<Application.Resources>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Padding" Value="0" />
    </Style>
</Application.Resources>      

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>

    <StackPanel Grid.Column="0">
        <GroupBox Header="New User">
            <StackPanel>
                <Label>First Name:</Label>
                <TextBox/>
                <Label>Last Name:</Label>
                <TextBox/>
            </StackPanel>
        </GroupBox>
    </StackPanel>
    <GroupBox Grid.Column="1" Header="Main">
        <StackPanel>
            <Label>I want default padding here</Label>
        </StackPanel>
    </GroupBox>
</Grid>

您可以像这样在 app.xaml 中使用 Style.Resources

<Application.Resources>
    <Style TargetType="StackPanel">
        <Style.Resources>
            <Style TargetType="Label">
                <Setter Property="Padding" Value="0" />
            </Style>
        </Style.Resources>
    </Style>
</Application.Resources>

这会设置在 StackPanel 中使用的所有 Label.Style。如果您只想为特定 StackPanels 中的标签提供此行为,您可以像这样使用 x:Key

<Application.Resources>
    <Style TargetType="StackPanel" x:Key="LabelStyledPanel">
        <Style.Resources>
            <Style TargetType="Label">
                <Setter Property="Padding" Value="0" />
            </Style>
        </Style.Resources>
    </Style>
</Application.Resources>

然后所有StackPanels使用StaticResource LabelStyledPanel使用标签样式。