当我在下面的代码中扩展Expander时,应用程序变得非常缓慢,需要2-3秒来响应用户触发的调整大小/移动事件。如果我将第二列设置为<ColumnDefinition Width="250"/>
,则响应时间仍然是最佳的。我在这里错过了什么? (我需要按照下面的UI,但没有缓慢的情况)
<UserControl>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Toolbar .. />
<DataGrid Grid.Row="1" ItemsSource="{Binding collection1}" .. />
<Expander Grid.Column="1" Grid.RowSpan="2">
<DataGrid ItemsSource="{Binding collection2}" .. />
</Expander>
</Grid>
</UserControl>
仅供参考:我怀疑在设置Width = Auto并为整个绑定数据源创建DataGridRow对象时未使用Row Virtualization ...
更新 以下也不能消除迟缓;
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width={Binding ElementName=expander, Path=Width} />
</Grid.ColumnDefinitions>
..
<Expander Name="expander" Grid.Column="1" Grid.RowSpan="2">
<DataGrid ItemsSource="{Binding collection2}" Width="300" .. />
</Expander>
答案 0 :(得分:1)
问题在于,如果将ColumnWidth
设置为Auto
,则会根据内容(此处为dataGrid)计算列宽。因此,您将使第二列非常大(即使您可能看不到它取决于您的布局),并且每次都会绘制dataGrid的列。
基本上,你放弃了columnVirtualization
(不是rowVirtualization
)的好处。
这就是为什么你永远不要将DataGrid
放入ScrollViewer
的原因。
的解决方案的
在网格上设置VirtualizingStackPanel.IsVirtualizing="True"
如果这不起作用,你可能需要自己处理调整大小,没有真正的选择。