我可以仅在某个布局中将WPF样式应用于元素吗?

时间:2017-01-30 18:17:29

标签: wpf xaml wpf-style

我有TextBlock这样的风格:

<Style TargetType="TextBlock" x:Key="FormLabel">
    <Setter Property="Height" Value="20" />
    <Setter Property="Margin" Value="10" />
    <Setter Property="TextAlignment" Value="Right" />
    <Setter Property="VerticalAlignment" Value="Center" />
</Style>

我在基于Grid的表格中使用它,例如:

<TextBlock Text="Code" Grid.Row="1" Grid.Column="0" Style="{StaticResource FormLabel}" />

现在,我不想在网格中的每个TextBlock上重复样式名称,而是希望例如有Grid样式,如:

<Style TargetType="Grid" x:Key="FormGrid">
    <Setter Property="Width" Value="400" />
    ...
</Style>

如果可能的话,我希望将TextBlock样式修改为仅当该元素是Grid样式为FormGrid的子元素时才应用于该元素。

这是否可能,如果可行,我该如何实现呢?

2 个答案:

答案 0 :(得分:4)

这确实可以通过在另一个样式中使用隐式样式作为资源来实现。举个例子:

...
<Window.Resources>
    <Style x:Key="FormGrid" TargetType="Grid">
        <Style.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Height" Value="20" />
                <Setter Property="Margin" Value="10" />
                <Setter Property="TextAlignment" Value="Right" />
                <Setter Property="VerticalAlignment" Value="Center" />
            </Style>
        </Style.Resources>
        <Setter Property="Width" Value="400" />
    </Style>
</Window.Resources>
<StackPanel>
    <Grid Style="{StaticResource FormGrid}">
        <TextBlock Text="This text block is styled with FormGrid TextBlock implicit style."/>
    </Grid>        
    <TextBlock Text="This text block uses the default style."/>
</StackPanel>
...

答案 1 :(得分:0)

开箱即用的WPF功能无法做到这一点。你在这里看到的是CSS样式选择器。 WPF仅允许通过BasedOn属性继承样式。我不确定这是否可以作为替代方案,但您可以将该特定TextBlock样式定义为该网格资源的一部分,并将其定位为匹配其中的任何文本块。

<Grid.Resources>
   <Style TargetType="TextBlock">
    <Setter Property="Height" Value="20" />
    <Setter Property="Margin" Value="10" />
    <Setter Property="TextAlignment" Value="Right" />
    <Setter Property="VerticalAlignment" Value="Center" />
   </Style>
</Grid.Resources>