【问题标题】:GridViewColumn autosize only work onceGridViewColumn 自动调整大小只工作一次
【发布时间】:2017-07-29 07:23:38
【问题描述】:

我在应用程序退出时存储列宽并在启动时恢复它们。除非用户双击标题,否则一切正常。这会导致列宽变为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 没有成功)?

【问题讨论】:

  • Width="Auto" 代替 NaN 不起作用吗?
  • 这会阻止用户调整列的大小:stackoverflow.com/questions/181956/…
  • @TyCobb, GridLength.Auto 用于GridColumnDefinition.Width。这里GridViewColumn.Widthdouble 类型。
  • @mm8,我不想阻止用户调整大小;)仅从那个非常特别double.NaNlol)双击自动调整大小。跨度>
  • @Sinatr 知道了。我正在查看这个问题,其中答案的宽度设置为 auto 我认为可以适合您的 让它总是自动调整大小 stackoverflow.com/questions/560581/…

标签: c# wpf


【解决方案1】:

您需要在每次更新时重置列的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;

}

要禁用双击调整大小,您可以像这样处理GridViewColumnHeaderPreviewMouseLeftButtonDown 事件:

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

【讨论】:

  • 似乎有效。这是一个肮脏的把戏(将值设置为当前的实际宽度,然后再设置为NaN),我从来没有想过这样做。禁用也可以,合二为一,谢谢!
【解决方案2】:

这是 WPF GridViewwell know 行为。

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

【讨论】:

  • 典型的荒谬的反对票:这就是他们保证答案质量的方式:-)
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多