WPF Datagrids медленнее при использовании Авто размер столбца - PullRequest
0 голосов
/ 18 февраля 2011

Когда я раскрываю Expander в приведенном ниже коде, приложение становится очень вялым и занимает 2-3 секунды, чтобы ответить на события изменения размера / перемещения, инициированные пользователем. Если я установлю для второго столбца значение <ColumnDefinition Width="250"/>, время отклика останется оптимальным. Что мне здесь не хватает? (Мне нужен пользовательский интерфейс, как показано ниже, но без вялости)

<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 создаются для всего связанного источника данных ...

UPDATE Следующее также не устраняет медлительность;

<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 Ответ

1 голос
/ 18 февраля 2011

Проблема в том, что если вы установите ColumnWidth на Auto, ширина столбца будет рассчитываться в зависимости от содержимого, в данном случае dataGrid. Таким образом, у вас будет очень большой второй столбец (даже если он может не отображаться в зависимости от вашего макета), и столбцы dataGrid будут отображаться каждый раз.

Таким образом, вы теряете преимущества columnVirtualization (не rowVirtualization).

Это та же самая причина, по которой вы никогда не должны ставить DataGrid в ScrollViewer.

Решение
Установите VirtualizingStackPanel.IsVirtualizing="True" в вашей сетке

если это не сработает, вам, возможно, придется позаботиться об изменении размера самостоятельно, здесь нет никаких реальных вариантов.

...