WPF TreeView Виртуализация - PullRequest
       2

WPF TreeView Виртуализация

17 голосов
/ 28 декабря 2010

Я пытаюсь выяснить эту функцию виртуализации, я не уверен, правильно ли я ее понимаю или что происходит, но я использую профилировщик памяти ANTS для проверки количества элементов в виртуализированном TreeView и это просто продолжает расти. У меня есть TreeView с 1 ​​001 элементом (1 корень, 1000 подпунктов), и я всегда получаю до 1 001 TreeViewItems, 1 001 ToggleButtons и 1 001 TextBlocks. Разве виртуализация не должна повторно использовать элементы? Если так, почему у меня есть 1 001 каждого? Кроме того, CleanUpVirtualizedItem никогда не срабатывает.

Дайте мне знать, если я правильно понимаю, и если у вас есть ресурсы, как это использовать. Я искал по интернету, но не нашел ничего полезного.

EDIT:

Даже память, используемая деревом, вырастает из апоркса. От 4 до 12 Мб, когда я расширяюсь и прокручиваю все элементы.

Дайте мне знать, спасибо.

Это мой код.

XAML:

<Window x:Class="RadTreeViewExpandedProblem.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <TreeView x:Name="treeView"
                  VirtualizingStackPanel.IsVirtualizing="True"
                  VirtualizingStackPanel.CleanUpVirtualizedItem="TreeView_CleanUpVirtualizedItem">
            <TreeView.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel />
                </ItemsPanelTemplate>
            </TreeView.ItemsPanel>
        </TreeView>
    </Grid>
</Window>

C #:

 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            TreeViewItem rootItem = new TreeViewItem() { Header = "Item Level 0" };

            for (int i = 0; i < 1000; i++)
            {
                TreeViewItem itemLevel1 = new TreeViewItem() { Header = "Item Level 1" };

                itemLevel1.Items.Add(new TreeViewItem());

                rootItem.Items.Add(itemLevel1);
            }

            treeView.Items.Add(rootItem);
        }

        private void TreeView_CleanUpVirtualizedItem(object sender, CleanUpVirtualizedItemEventArgs e)
        {

        }
    }

Ответы [ 3 ]

6 голосов
/ 29 декабря 2010

Хорошо, проблема в том, что виртуализация работает только тогда, когда TreeView использует Binding, а не когда узлы генерируются один за другим в коде, как в моем примере. Что за облом.

6 голосов
/ 28 декабря 2010

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

Это сводится к виртуализации пользовательского интерфейса только рендеринг того, что необходимо и в пределах видимости; в то время как виртуализация данных хранит в памяти только то, что может понадобиться в данный момент времени.

В Bea есть два великолепных поста о виртуализации пользовательского интерфейса и виртуализации данных , а также рассматриваются различия и способы обхода ограничения отсутствия поддержки виртуализации данных, которая, как представляется, является тем, чем вы являетесь после того, как.

EDIT:

Начиная с 3.5 SP1 поддержка виртуализации была добавлена ​​в TreeView. Возможно, достаточно удалить шаблон ItemsPanel и просто установить свойства в TreeView.

3 голосов
/ 12 сентября 2012

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

, поэтому, если у вас есть только один корневой элемент с 1000 дочерними элементами,Никакой переработки не произойдет, потому что для переработки доступен только 1 контейнер.

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

Конечно, проблема только усугубляется, если уровень вложенности вашего дерева больше 2 или 3.

Я не знаю, есть ли решение дляэта проблема.

...