GridViewColumn仅自动调整工作

时间:2017-03-08 16:04:27

标签: c# wpf

我在应用程序出口处存储列宽并在启动时恢复它们。除非用户双击标题,否则一切正常。这会导致列宽变为double.NaN我理解为标志用于自动调整大小。然后我有问题。

在调查此问题时,我注意到设置列宽NaN将启用自动调整大小但仅启用一次

这是一个复制品:

<ListView x:Name="listView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="A" Width="NaN" />
        </GridView>
    </ListView.View>
</ListView>

然后使用以下点击处理程序添加两个按钮:

void button1_Click(object sender, RoutedEventArgs e) => listView.Items.Add("abcd");
void button2_Click(object sender, RoutedEventArgs e) => listView.Items.Add("ABCDEFGHIJKL");

首先点击button1会自动调整列以适合"abcd"。然后单击button2将不会。

为什么呢?是否有解决方法让它始终自动调整大小或至少禁用用户双击调整大小(尝试this solution但没有成功)?

2 个答案:

答案 0 :(得分:3)

您需要在每次更新时重置列的Width

void button2_Click(object sender, RoutedEventArgs e)
{
    listView.Items.Add("ABCDEFGHIJKL");
    GridView gv = listView.View as GridView;
    gv.Columns[0].Width = gv.Columns[0].ActualWidth;
    gv.Columns[0].Width = double.NaN;

}

要禁用双击调整大小,您可以像这样处理PreviewMouseLeftButtonDown的{​​{1}}事件:

GridViewColumnHeader
<ListView x:Name="listView">
    <ListView.View>
        <GridView>
            <GridView.ColumnHeaderContainerStyle>
                <Style TargetType="{x:Type GridViewColumnHeader}">
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="listView_PreviewMouseLeftButtonDown"/>
                </Style>
            </GridView.ColumnHeaderContainerStyle>
            <GridViewColumn Header="A" Width="Auto" />
        </GridView>
    </ListView.View>
</ListView>

答案 1 :(得分:1)

这是WPF GridView的{​​{3}}行为。

多列的通用解决方案是注册事件处理程序(我的个人建议是SizeChanged

<ListView x:Name="listView" SizeChanged="listView_SizeChanged">

进行更新

private void listView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    foreach (GridViewColumn c in ((GridView)listView.View).Columns)
    {
        if (double.IsNaN(c.Width))
        {
            c.Width = c.ActualWidth;
        }
        c.Width = double.NaN;
    }
}