我可以将 WPF 样式仅应用于特定布局中的元素吗?
Can I apply a WPF style to an element only in a certain layout?
我的 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
样式,以便仅在该元素是具有样式 FormGrid
的 Grid
的子元素时才应用于该元素。
这可能吗?如果可以,我该如何实现?
开箱即用的 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>
这确实可以通过在另一种样式中使用隐式样式作为资源来实现。举个例子:
...
<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>
...
我的 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
样式,以便仅在该元素是具有样式 FormGrid
的 Grid
的子元素时才应用于该元素。
这可能吗?如果可以,我该如何实现?
开箱即用的 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>
这确实可以通过在另一种样式中使用隐式样式作为资源来实现。举个例子:
...
<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>
...