Включение виртуализации пользовательского интерфейса на WPFToolkit Accordion - PullRequest
2 голосов
/ 28 октября 2010

Я использую элемент управления WPFToolkit Accordion с элементами в аккордеоне, определенными как TreeView.

Для контекста, вот соответствующая часть XAML:

<ScrollViewer VerticalScrollBarVisibility="Auto" CanContentScroll="True">
    <layoutToolkit:Accordion DockPanel.Dock="Bottom"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                ItemsSource="{Binding FoodTypes}"
                SelectionMode="ZeroOrOne"
                VirtualizingStackPanel.IsVirtualizing="True"
                VirtualizingStackPanel.VirtualizationMode="Recycling">
        <layoutToolkit:Accordion.ContentTemplate>
            <DataTemplate>
                <TreeView Margin="0 0 0 0" BorderThickness="0" 
                          ItemsSource="{Binding ChildrenView}"
                          HorizontalAlignment="Stretch"
                          VerticalAlignment="Stretch"
                          VirtualizingStackPanel.IsVirtualizing="True"
                          VirtualizingStackPanel.VirtualizationMode="Recycling">

Первоначально я реализовал это только с помощью TreeView (без WPFToolkit Accordian) и 40000 элементов, загруженных менее чем за секунду.

Когда я реализовал структуру с гармошкой на корневом уровне, время загрузки при нажатии на расширитель возросло до более 7 секунд. Это слишком долго.

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

1 Ответ

1 голос
/ 31 января 2011

Я смог решить эту проблему, реализовав иерархическое дерево, используя список, как описано Бе Столльниц в ее блоге в статье «Есть ли уловки, которые помогут мне улучшить производительность TreeView? 1001 *http://bea.stollnitz.com/blog/?p=45. Это позволяет мне использовать панель стека виртуализации, поскольку она входит в состав WPF ListView. В этой статье объясняется, что виртуальная панель стека не отображается в древовидной структуре WPF. Таким образом, если вам нужна виртуализация данных в настоящее время, лучшим решением будет реализовать иерархическое дерево с ListBox или ListView. Это было не так сложно сделать, и теперь у меня отличная производительность.

...