C# GridViewColumn仅自动调整大小一次

C# GridViewColumn仅自动调整大小一次,c#,wpf,C#,Wpf,我在应用程序退出时存储列宽,并在启动时恢复它们。除非用户双击标题,否则一切正常。这会导致列宽变为double.NaN,我知道这是一个自动调整大小的标志。那我就有问题了 在调查该问题时,我注意到将列宽设置为NaN将启用自动调整大小,但仅允许一次 这是一份复印件: <ListView x:Name="listView"> <ListView.View> <GridView> <GridViewColumn He

我在应用程序退出时存储列宽,并在启动时恢复它们。除非用户双击标题,否则一切正常。这会导致列宽变为
double.NaN
,我知道这是一个自动调整大小的标志。那我就有问题了

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

这是一份复印件:

<ListView x:Name="listView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="A" Width="NaN" />
        </GridView>
    </ListView.View>
</ListView>
首先单击
按钮1
将自动调整列的大小以适合
“abcd”
。然后单击
按钮2
将不起作用


为什么??是否有一种解决方法可以使其始终自动调整大小或至少禁用用户双击调整大小(尝试但未成功)?

您需要在每次更新时重置列的宽度:

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;

}
要禁用双击调整大小,您可以如下处理
GridViewColumnHeader
PreviewMouseLeftButtonDown
事件:

<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>

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

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;

}
要禁用双击调整大小,您可以如下处理
GridViewColumnHeader
PreviewMouseLeftButtonDown
事件:

<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>
这是WPF
GridView
的一种行为

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

这是WPF
GridView
的一种行为

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


Width=“Auto”
而不是
NaN
不起作用吗?这会阻止用户调整列的大小:@TyCobb,
GridLength。Auto
用于
网格。此处
GridViewColumn.Width
double
类型。@mm8,我不想阻止用户调整大小;)只有通过非常特殊的(
double.NaN
lol)双击自动调整大小。@Sinatr得到了它。我在看这个问题,答案的宽度设置为auto,我认为这可以满足您的要求。AutoSize总是
Width=“auto”
而不是
NaN
不起作用?这会阻止用户调整列的大小:@TyCobb,
GridLength。auto
用于
Grid
。此处
GridViewColumn.Width
double
类型。@mm8,我不想阻止用户调整大小;)只有通过非常特殊的(
double.NaN
lol)双击自动调整大小。@Sinatr得到了它。我在看这个问题,答案是宽度设置为自动,我认为可以适合你的,自动调整似乎总是可行的。这是一个肮脏的把戏(将值设置为当前实际宽度,然后再次设置为
NaN
),我从未想过要这么做。禁用也有效,两个答案合一,谢谢!似乎有效。这是一个肮脏的把戏(将值设置为当前实际宽度,然后再次设置为
NaN
),我从未想过要这么做。禁用也有效,两个答案合一,谢谢!典型的荒谬否决票:这是他们如何保证答案的质量:-)典型的荒谬否决票:这是他们如何保证答案的质量:-)
<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;
    }
}