容器内的隐式样式

时间:2017-07-18 23:20:37

标签: wpf xaml wpf-style implicit-style

我想将Padding="0"应用于左侧边栏(第一个Label)中的每个StackPanel,以便左对齐每个TextBox(以及其他控件)

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

备选方案:

  1. 使用x:Key="sidebarLabel"。但是,对于我实际应用程序侧栏中的许多标签,此选项似乎是多余的。
  2. Padding=0添加到侧栏中的每个Label。这基本上与之前的替代方案相同。
  3. 将隐式样式移动到<StackPanel.Resources>。但是,我希望将样式(在App.xaml中)与XAML分开(在MainWindow.xaml中)。
  4. <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>
    

1 个答案:

答案 0 :(得分:4)

您可以在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>

这会设置Label.Style内使用的所有StackPanel。如果您只想对特定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都使用标签样式。