GridViewColumnHeader 不跨越整个 ListView 宽度

GridViewColumnHeader not spanning whole ListView width

我的 WPF 项目中的 ListView/GridView 组合布局有问题。列 header 只是没有跨越 parent ListView 的整个宽度。我试图到处寻找文档,但没有找到任何关于底层容器/控件模板的线索。

我想 header 的标准控件模板包含一些我没有注意的东西,我无法理解它。

(简化的)ListView 在包含 header 的行的左侧和右侧有几个像素 space,其中 parent ListView 的背景是可见:

https://i.imgur.com/XijV88a.jpg

问题:如何让列header横跨ListView的整个宽度,同时让少数像素space消失?

我的XAML:

<ListView Padding="0"
          BorderThickness="0"
          Background="Red">

    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Background" Value="LightGray" />
            <Setter Property="Margin" Value="0" />
            <Setter Property="Padding" Value="0" />
            <Setter Property="BorderThickness" Value="0" />
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.View>
        <GridView>
            <GridView.ColumnHeaderContainerStyle>
                <Style TargetType="{x:Type GridViewColumnHeader}">
                    <Setter Property="Foreground" Value="White" />
                    <Setter Property="Background" Value="Black" />
                    <Setter Property="BorderThickness" Value="0" />
                    <Setter Property="Margin" Value="0" />
                    <Setter Property="Padding" Value="0" />
                    <Setter Property="HorizontalAlignment" Value="Stretch" />
                </Style>
            </GridView.ColumnHeaderContainerStyle>

            <GridViewColumn Header="1" Width="40"/>
            <GridViewColumn Header="2" Width="40"/>
            <GridViewColumn Header="3" Width="40"/>

        </GridView>
    </ListView.View>

    <ListViewItem> 1 </ListViewItem>
    <ListViewItem> 2 </ListViewItem>
</ListView>

到目前为止实现我想要的外观的唯一方法是将列表视图的背景更改为与 headers 相同的颜色 - 不过必须有更好的方法。感谢您的帮助!

此列不支持“*”作为宽度参数,因此您不能轻易说 - 填写其余部分...

您应该做的是连接 ListView 的 SizeChanged 事件并在那里进行计算。因此,例如,在您的情况下,如果我们希望前两列各占 40,第三列占其余部分,您可以这样做:

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    ListView listView = sender as ListView;
    GridView gView = listView.View as GridView;

    var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth;

    gView.Columns[0].Width = 40;
    gView.Columns[1].Width = 40;
    gView.Columns[2].Width = workingWidth - 80;
}

编辑

对于 header 行中的间隙(向左和向右),您想像这样更改 ColumnHeaderContainerStyle:

<GridView.ColumnHeaderContainerStyle>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Background" Value="Black" />
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="Margin" Value="-2,0,-2,0" />
        <Setter Property="Padding" Value="0" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
    </Style>
</GridView.ColumnHeaderContainerStyle>

因此请确保将每边的边距减少 -2。