我有一个 GridViewColumn,其内容是一个 TextBlock:
GridViewColumn column = new GridViewColumn();
column.Header = new TextBlock { Text = header };
MyGridView.Columns.Add(column);
我在运行时更改了第二列的 TextBlock 背景(黑色),结果如下:

TextBlock 不会占用所有可用空间。
为什么?我怎样才能解决这个问题?
谢谢。
默认情况下,TextBlock 仅与其内容一样大。尝试这个:
column.Header = new TextBlock { Text = header, HorizontalAlignment = HorizontalAlignment.Stretch };
此处的文档: System.Windows.Horizo ntalAlignment 。
您的问题是因为您在 ListView 内做事,在对齐/调整大小时需要稍微不同地处理。检查这个先前的 SO 问题以获取有关如何在 XAML 中执行此操作的答案:在 WPF 中拉伸控件以填充 ListView 列
我有点困惑为什么另一个响应被标记为答案。问题是标头容器没有被拉伸(如果您扫描 WPF 可视化树,您可以看到ContentPresenter不是Stretch,Center而是相反)。
如果要拉伸标题,使标题中显示的内容占据所有标题空间,则需要覆盖GridViewColumnHeader样式。
<ListView HorizontalContentAlignment="Stretch" ...>
<ListView.Resources>
<Style x:Key="StretchedHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Width="200" HeaderContainerStyle="{StaticResource StretchedHeaderStyle}" DisplayMemberBinding="{Binding Path=SomeValue, Mode=OneWay"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
上面的代码示例将生成一个延伸到其容器中的列表视图。它具有静态资源标题拉伸样式(在这种情况下必须应用于您要拉伸的每一列,删除x:Key和HeaderContainerStyle=以使所有标题都拉伸)。它还全局地将拉伸样式应用于所有列单元格(如果需要,可以将其应用于单个列,类似于标题样式的显示方式)。
如果您需要在后面的代码中执行此操作,您只需创建样式并在列 ( HeaderContainerStyle) 上设置适当的样式属性。
更新
我刚刚意识到有一种更好的方法来全局应用标题样式。与其将类型应用样式声明为ListView资源,不如将样式直接应用于GridView.
<ListView HorizontalContentAlignment="Stretch" ...>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridView.ColumnHeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridView.Columns>
<GridViewColumn Width="200" DisplayMemberBinding="{Binding Path=SomeValue, Mode=OneWay"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
两种方法都实现了相同的结果,但是上面的这个方法是一种更简洁的方法,因为您正在分配直接负责标题容器样式的样式属性。但是,如果您只需要拉伸特定的列,那么第一种方法是您最好的选择。