2

我有一个 GridViewColumn,其内容是一个 TextBlock:

GridViewColumn column = new GridViewColumn();
column.Header = new TextBlock { Text = header };
MyGridView.Columns.Add(column);

我在运行时更改了第二列的 TextBlock 背景(黑色),结果如下:

在此处输入图像描述

TextBlock 不会占用所有可用空间。
为什么?我怎样才能解决这个问题?
谢谢。

4

2 回答 2

3

默认情况下,TextBlock 仅与其内容一样大。尝试这个:

column.Header = new TextBlock { Text = header, HorizontalAlignment = HorizontalAlignment.Stretch };

此处的文档: System.Windows.Horizo ​​ntalAlignment 。

编辑:

您的问题是因为您在 ListView 内做事,在对齐/调整大小时需要稍微不同地处理。检查这个先前的 SO 问题以获取有关如何在 XAML 中执行此操作的答案:在 WPF 中拉伸控件以填充 ListView 列

于 2012-10-02T11:09:26.543 回答
2

我有点困惑为什么另一个响应被标记为答案。问题是标头容器没有被拉伸(如果您扫描 WPF 可视化树,您可以看到ContentPresenter不是StretchCenter而是相反)。

如果要拉伸标题,使标题中显示的内容占据所有标题空间,则需要覆盖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:KeyHeaderContainerStyle=以使所有标题都拉伸)。它还全局地将拉伸样式应用于所有列单元格(如果需要,可以将其应用于单个列,类似于标题样式的显示方式)。

如果您需要在后面的代码中执行此操作,您只需创建样式并在列 ( 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>

两种方法都实现了相同的结果,但是上面的这个方法是一种更简洁的方法,因为您正在分配直接负责标题容器样式的样式属性。但是,如果您只需要拉伸特定的列,那么第一种方法是您最好的选择。

于 2014-11-04T19:32:29.587 回答