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>
这是WPFGridView
的一种行为
多列的通用解决方案是注册一个事件处理程序(我个人的建议是SizeChanged
)
这是WPFGridView
的一种行为
多列的通用解决方案是注册一个事件处理程序(我个人的建议是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;
}
}