Я пытаюсь выяснить эту функцию виртуализации, я не уверен, правильно ли я ее понимаю или что происходит, но я использую профилировщик памяти 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)
{
}
}