绑定到图像列表的非常简单的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>
我尝试过的事情:
我不能做的事情:
在.Net 4.0中是否有解决此问题的方法?如果没有,我将不得不考虑一种解决方法,例如使用其他代替网格,尽管我已经花了很多时间它并且不愿意失去那项工作。
提前致谢
答案 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">