Estoy tratando de descubrir esta característica de virtualización, no estoy seguro si estoy entendiendo mal o qué está pasando, pero estoy usando el generador de perfiles de memoria ANTS para verificar el número de elementos en TreeView virtualizado, y sigue aumentando. Tengo un TreeView con 1,001 elementos (1 raíz, 1000 subpuntos), y siempre obtengo hasta 1,001 TreeViewItems, 1,001 ToggleButtons y 1,001 TextBlocks. ¿No se supone que la virtualización reutilice los artículos? Si es así, ¿por qué tendría 1,001 de cada uno? Además, CleanUpVirtualizedItem nunca se dispara.WPF TreeView Virtualization
Avísame si entiendo esto mal y si tienes recursos sobre cómo usarlo. He buscado en Internet pero no he encontrado nada útil.
EDIT:
Incluso la memoria utilizada por el árbol crece de aporx. 4mb a 12mb cuando me expando y me desplazo por todos los elementos.
Déjame saber gracias.
Este es mi código.
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)
{
}
}
Eso no debería ser demasiado difícil, solo usa un ObservableCollection para unir la vista de árbol y agrega tus artículos a la colección cuando sea necesario - esta es la más idiomática De todos modos, WPF no quiere agregar elementos directamente. – BrokenGlass
Me gusta tu idea. La forma en que sabré cuando necesito más elementos es cuando me desplazo hacia arriba o hacia abajo en el árbol. ¿Crees que eso funcionaría con este enfoque? – Carlo
@Calro: seguro, debería funcionar – Liero