我如何解决这个WPF数据网格无限度/安排错误?

时间:2013-05-06 14:32:25

标签: wpf datagrid resize

绑定到图像列表的非常简单的WPF数据网格。在使用分隔符(或主窗口本身)调整列的大小时,CPU变为100%并且应用程序进入无限循环的排列/调整大小,导致窗口内容来回跳跃并且不再处理(锁定)用户输入。

数据网格定义为:

    <DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Image 1" Width="40*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding ImagePath}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="EmptyText" />
        </DataGrid.Columns>
    </DataGrid>

我尝试过的事情:

  • 继承DataGrid并覆盖网格的排列/测量。
  • 覆盖窗口的排列/测量。
  • 调整网格滚动条,关闭它们以及各种选项。

我不能做的事情:

  • 此项目不支持升级到.Net 4.5。
  • 删除列,然后网格中没有任何点。

在.Net 4.0中是否有解决此问题的方法?如果没有,我将不得不考虑一种解决方法,例如使用其他代替网格,尽管我已经花了很多时间它并且不愿意失去那项工作。

提前致谢

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,经过数小时的努力,我终于找到了解决方法。

将事件处理程序添加到DataGrid中的SizeChanged事件:

<DataGrid SizeChanged="DataGrid_SizeChanged">

这是事件处理程序的代码:

private void DataGrid_SizeChanged(object a_sender, SizeChangedEventArgs a_args)
{
    try
    {
        DataGrid dataGrid = a_sender as DataGrid;
        if (dataGrid != null)
        {
            double widthDifference = Math.Abs(a_args.PreviousSize.Width - a_args.NewSize.Width);
            double heightDifference = Math.Abs(a_args.PreviousSize.Height - a_args.NewSize.Height);

            if ((widthDifference != 0 && widthDifference < 1) || (heightDifference != 0 && heightDifference < 1))
            {
                dataGrid.Measure(new Size(Math.Round(dataGrid.ActualWidth), Math.Round(dataGrid.ActualHeight)));
                dataGrid.InvalidateMeasure();
            }
        }
    }
    catch (Exception) { }
}

我不知道这是否是一个很好的解决方案,但这是唯一对我有用的东西。

答案 1 :(得分:0)

与往常一样,在要求我再次检查一些内容的行为中,我现在有一个可用的解决方法。

将数据网格更改为始终显示滚动条,如下所示。

        <DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">