2017-03-08 38 views
1

我在应用程序退出时存储列宽并在启动时恢复它们。一切工作正常,除非用户双击标题。这会导致列宽变为double.NaN,据我了解,这是用于自动调整的标记。然后我有问题。GridViewColumn只能自动调整一次工作

在调查问题时,我注意到设置列宽为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而没有成功)?

+0

是否'WIDTH =“自动”'代替'NaN'不工作? – TyCobb

+0

这可以防止用户能够调整列的大小:http://stackoverflow.com/questions/181956/prevent-user-from-resizing-columns-with-wpf-listview – mm8

+0

@TyCobb,'GridLength.Auto' is对于'Grid' [[ColumnDefinition.Width]](https://msdn.microsoft.com/zh-cn/library/system.windows.controls.columndefinition.width(v = vs.110).aspx)。这里'GridViewColumn.Width'是'double'类型的。 – Sinatr

回答

2

您需要重置每个更新列的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事件的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> 

private void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) => 
    e.Handled = e.ClickCount == 2; 
+0

似乎有效。这是一个肮脏的伎俩(将值设置为当前的实际宽度,然后再次设置为'NaN'),我从来没有想过这样做。禁用也有效,两个答案中的一个,谢谢! – Sinatr

0

这是一个well know behavi我们的WPF GridView

多个列的通用的解决方案是注册一个事件处理程序(我个人的建议是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; 
    } 
} 
+2

典型的荒谬downvote:这是如何在SO他们保证答案的质量:-) – 2017-03-08 20:41:43

+0

一个有趣的想法,谢谢。 – Sinatr