这种行为实际上是设计使然。这个链接 http://www.11011.net/archives/000692.html描述正在发生的事情。早在 2006 年 10 月,Microsoft Connect 上就有一个错误报告。不幸的是,给定链接中指向错误报告的原始链接不再有效。
在这里,我将引用 Connect 的错误报告的答案,以防将来给定的链接出现故障。
这种行为是“设计使然”,这就是原因。模板被视为封装边界。这些模板生成的元素落在该边界内。具有匹配 TargetType 的样式的查找将在此边界停止。因此,通过模板生成的重现中的 TextBlock 不会选择有问题的样式。而在模板外部定义的 TextBlock 则可以。
解决此问题的一种方法是为样式指定一个显式名称,并在模板内的 TextBlock 上通过该名称引用样式。
您会看到他们已经为您的问题提供了解决方法。他们说你应该给你TextBlock
风格在Window.Resources
名称并引用模板中的样式。
我认为这不是您真正想要的,因为在这种情况下,样式不会自动应用于所有 TextBlock(在 DataTemplate 之外)。因此,不要给出样式Windows.Resources
一个明确的名字,你可以在你的BasedOn
引用样式时的属性。您可以像这样指定类型,而不是指定样式的名称。
<GridViewColumn Header="Left" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" />
</DataTemplate.Resources>
<TextBlock Text="{Binding Left}" TextAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
使用这种方法,您仍然具有不指定样式名称的优势,并且样式会应用于所有 TextBlock。
作为参考,整个 Window XAML 如下所示。现在,所有列GridView
有相同的风格。
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" SizeToContent="WidthAndHeight">
<Window.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="TextTrimming" Value="CharacterEllipsis" />
<Setter Property="Background" Value="Aqua" />
</Style>
<Style x:Key="ListViewItemStyle" TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</Window.Resources>
<ListView ItemContainerStyle="{StaticResource ListViewItemStyle}">
<ListView.View>
<GridView>
<GridViewColumn Header="Bottom" Width="50" DisplayMemberBinding="{Binding Bottom}" />
<GridViewColumn Header="Left" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" />
</DataTemplate.Resources>
<TextBlock Text="{Binding Left}" TextAlignment="Center" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Right" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}" />
</DataTemplate.Resources>
<TextBlock Text="{Binding Right}" TextAlignment="Right" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Top" Width="50" DisplayMemberBinding="{Binding Top}" />
</GridView>
</ListView.View>
<ListView.Items>
<Thickness>1,2,3,4</Thickness>
<Thickness>5,6,7,8</Thickness>
<Thickness>9,10</Thickness>
</ListView.Items>
</ListView>
</Window>