Próbuję zrozumieć tę funkcję wirtualizacji, nie jestem pewien, czy rozumiem ją źle lub co się dzieje, ale używam profilera pamięci ANTS, aby sprawdzić liczbę elementów w zwirtualizowany TreeView, który stale rośnie. Mam TreeView z 1 001 przedmiotami (1 root, 1000 podelementów) i zawsze dostaję do 1 001 TreeViewItems, 1 001 ToggleButtons i 1 001 TextBlocks. Czy wirtualizacja nie ma na celu ponownego użycia przedmiotów? Jeśli tak, dlaczego miałbym mieć 1 001 każdego? Ponadto obiekt CleanUpVirtualizedItem nigdy nie jest uruchamiany.Wirtualizacja drzewa WPF TreeView
Daj mi znać, jeśli rozumiem to źle i jeśli masz zasoby, jak z tego korzystać. Szukałem w Internecie, ale nie znalazłem nic przydatnego.
EDIT:
Nawet pamięć używana przez drzewo wyrasta z aporx. 4mb do 12mb, gdy rozwijam i przewijam wszystkie przedmioty.
Daj mi znać dzięki.
To jest mój kod.
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)
{
}
}
To nie powinno być zbyt wielkim problemem, wystarczy użyć ObservableCollection, aby powiązać widok drzewa i dodać swoje przedmioty do kolekcji, gdy jest to potrzebne - jest to bardziej idiomatyczne Oczywiście WPF, nie chcesz ręcznie dodawać elementów bezpośrednio. – BrokenGlass
Podoba mi się twój pomysł. Sposób, w jaki będę wiedzieć, kiedy potrzebuję więcej przedmiotów, to przewijanie w górę lub w dół po drzewie. Czy myślisz, że to zadziała z takim podejściem? – Carlo
@Calro: jasne, to powinno działać – Liero