Ошибка прокрутки в виртуализированном древовидном представлении WPF - PullRequest
4 голосов
/ 02 ноября 2010

Я использую виртуальное древовидное представление в WPF для отображения 3-уровневой глубокой иерархии с большим количеством дочерних узлов (5000+).

<TreeView Grid.Row="0" Grid.Column="0" Name="TestTree"  ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="True">
...
</TreeView>

Что происходит, если я расширяю дочерние узлына 3-м уровне и прокрутите до самого конца, контент не будет отображаться правильно, и скроллер «переворачивается», и я могу продолжать прокручивать вниз вечно, поведение повторяется после некоторой дополнительной прокрутки.

Это только происходитв виртуализированном режиме, но, к сожалению, из-за большого количества дочерних узлов время загрузки дерева в не виртуализированном режиме является непомерно большим.

Я прочитал следующие ссылки на SO здесь иоригинальный поток на форумах MSDN здесь , но предложенный обходной путь вызова UpdateLayout() в обработчике SelectedItemChanged у меня не работал.и если да, то есть ли обходной путь?

Цените любой вклад - спасибо!

1 Ответ

0 голосов
/ 02 июня 2011

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

Я обычно использую TreeViewItemViewModelClass в таких случаях, что-то вроде:

public class TreeViewItemViewModel : INotifyPropertyChanged
{
    public IEnumerable<TreeViewItemViewModel> Childs { get; }
    public bool IsSelected { get; set; }
    public bool IsExpanded { get; set; }
    (...)
}

и затем в ItemContainerStyle TreeView с привязкой TwoWay связывают свойства IsSelected и IsExpanded, а затем в установщик свойства IsExpanded загружаются все его дочерние элементы.

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

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...