Как избавиться от повреждения дисплея при горизонтальной прокрутке в WPF4 DataGrid с группировкой? - PullRequest
5 голосов
/ 12 апреля 2011

Я пытаюсь создать сетку данных с группировкой, и я получаю искажения отображения (пустые области) во время горизонтальной прокрутки.Проблема появляется только , когда определен GroupStyle.ContainerStyle.Сетка данных должна содержать 200 или более строк, чтобы воспроизвести проблему.

UPDATE2: Связанные отзывы Microsoft Connect .

UPDATE: Парень из Microsoft по адресу social.msdn.com отметил, что добавление группировки отключает виртуализацию сетки данных.Возможно, это корень проблемы.Я удалил группировку из своего образца и установил VirtualizingStackPanel.IsVirtualizing в false и получил точно такой же тип искажения.

Код для воспроизведения проблемы:

<DataGrid ItemsSource="{Binding Source={StaticResource ResourceKey=cvsGoods}}"
          CanUserAddRows="False" CanUserReorderColumns="False"
          CanUserDeleteRows="False" CanUserResizeRows="False"
          CanUserSortColumns="False" AutoGenerateColumns="True">
    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <ItemsPresenter  />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

После нескольких горизонтальных прокруток досправа и сзади слева остаются пустые области.Я попробовал это на WinXP и Win7.

Вопрос: как избавиться от этой ошибки?Есть ли обходной путь?Есть предложения?

Снимок экрана, иллюстрирующий проблему:

Display corruption

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Это выстрел в темноте, но когда прокрутка завершена, просто вызовите InvalidateVisual () для элемента управления.

Кроме того, поскольку вы говорите, что он содержит приблизительно 200 строк, мы столкнулись с похожими проблемами отзывчивости при высокой нагрузке. Мы смогли обойти это, обновив пользовательский интерфейс из фонового потока. Вы можете прочитать больше об этом здесь .

1 голос
/ 12 мая 2011

Я думаю, что ваш шаблон для groupstyle вызывает некоторое ограничение, я попытался загрузить 1000 строк, и он работал нормально. Еще один улов здесь - попробуйте разместить заголовок внутри контейнера. В следующем примере я использовал TreeViewItem,

                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <TreeViewItem IsExpanded="True">
                                        <TreeViewItem.Header>
                                            <TextBlock Text="{Binding Name}" />
                                        </TreeViewItem.Header>
                                        <ItemsPresenter />
                                    </TreeViewItem>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>

Дайте мне знать, если это поможет.

-Fahad

1 голос
/ 12 апреля 2011

Однажды мы столкнулись с одной и той же проблемой (но не одной и той же причиной), то есть сетка данных будет иметь пустые области непосредственно перед первым столбцом некоторых строк. То, как мы решили (взломали) это в то время, было отключить заголовок строки (не знаю, как это решило проблему, но выяснил, что пустые области на самом деле были заголовками строк).

Мы отключили (правильное слово сделало бы его размером ноль) заголовка строки, установив ширину в ноль, что-то вроде кода ниже:

<wpftk:DataGrid>
...
...
<wpftk:DataGrid.RowHeaderStyle>
    <Style  TargetType="wpftk:DataGridRowHeader" >
        <Setter Property="Width" Value="0" />
        <Setter Property="MaxWidth" Value="0" />
    </Style>
</wpftk:DataGrid.RowHeaderStyle>
...
...
</wpftk:DataGrid>

Дайте мне знать, если это работает в вашем случае.

Еще одна вещь, которую мы заметили, что если мы отключим виртуализацию или стиль заголовка строки, это решит нашу проблему. Мы пошли за отключение заголовка строки, так как он нам не нужен.

...