使用自动列大小时,WPF Datagrid会变慢

时间:2011-02-18 06:59:55

标签: wpf datagrid wpfdatagrid

当我在下面的代码中扩展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>

1 个答案:

答案 0 :(得分:1)

问题在于,如果将ColumnWidth设置为Auto,则会根据内容(此处为dataGrid)计算列宽。因此,您将使第二列非常大(即使您可能看不到它取决于您的布局),并且每次都会绘制dataGrid的列。

基本上,你放弃了columnVirtualization(不是rowVirtualization)的好处。

这就是为什么你永远不要将DataGrid放入ScrollViewer的原因。

的解决方案
在网格上设置VirtualizingStackPanel.IsVirtualizing="True"

如果这不起作用,你可能需要自己处理调整大小,没有真正的选择。