5

一个非常简单的 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 并覆盖网格的 Arrange/Measure。
  • 覆盖窗口的排列/测量。
  • 调整网格滚动条,关闭它们和各种选项。

我不能做的:

  • 升级到 .Net 4.5 不是此项目的选项。
  • 删除列,那么网格中就没有点了。

.Net 4.0 中的这种行为有什么办法吗?如果没有,我将不得不考虑一种解决方法,例如使用其他东西来代替网格,尽管我已经花了很长时间对其进行造型并且不愿意失去这项工作。

提前致谢

4

2 回答 2

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) { }
}

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

于 2015-07-21T10:56:20.450 回答
0

与往常一样,在询问的过程中,我再次检查了一些东西,现在我有了一个可用的解决方法。

将数据网格更改为始终使其滚动条可见,如下所示。

        <DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">
于 2013-05-06T15:04:31.460 回答