WPF TreeView-Virtualisierung
Ich versuche herauszufinden, das Virtualisierung-feature, ich bin mir nicht sicher, ob ich es bin, verstehen es falsch, oder was Los ist, aber ich bin mit der ANTS memory profiler, um zu überprüfen, dass die Anzahl der Elemente in einer virtualisierten TreeView, und es wird einfach immer größer. Ich habe ein TreeView mit 1,001 Elemente (1, root, 1000 sub-Elemente), und ich bekomme immer bis zu 1,001 TreeViewItems, 1,001 ToggleButtons und 1,001 TextBlocks. Ist das nicht die Virtualisierung soll die Wiederverwendung der Elemente? Wenn ja, warum hätte ich 1,001 jeder? Auch die CleanUpVirtualizedItem nie ausgelöst.
Lassen Sie mich wissen, wenn ich dieses Verständnis falsch und wenn Sie die Ressourcen auf, wie Sie diese nutzen. Ich habe gesucht über das internet, aber habe nicht gefunden was nützlich ist.
EDIT:
Sogar den Speicher verwendet, durch die der Baum wächst aus aporx. 4mb, 12mb, wenn ich erweitern und scrollen durch alle Elemente.
Lassen Sie mich wissen, danke.
Dies ist mein code.
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)
{
}
}
InformationsquelleAutor Carlo | 2010-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist der Unterschied UI virtualization (die WPF unterstützt out of the box, auf unterschiedliche Steuerelemente) versus Daten-Virtualisierung (WPF nicht unterstützt out of the box).
Läuft es auf UI-Virtualisierung nur das Rendern, was erforderlich ist und in Ansicht; während die Daten virtulization nur halten, was erforderlich sein kann, zu einer bestimmten Zeit in Erinnerung.
Bea hat zwei tolle Beiträge über UI-Virtualisierung und Daten-Virtualisierung und geht in die Unterschiede und wie zur Umgehung der Einschränkung, keine Unterstützung für Daten-Virtualisierung, die zu sein scheint, was Sie sind nach.
EDIT:
Als der 3.5 SP1 die Unterstützung für die Virtualisierung wurde Hinzugefügt, um die Strukturansicht. Vielleicht entfernen Sie Ihre ItemsPanel Vorlage und nur die Einstellung der Eigenschaften für das TreeView-sollte ausreichen.
Zusätzlicher Hinweis zum entfernen ItemsPanel Vorlage, der, wie ich glaube, die Standard-Vorlage von 3,5 SP1 sollte ein VirtualizingStackPanel, so sollte es keine Notwendigkeit, ändern Sie die Vorlage, aktivieren Sie einfach die Eigenschaft, wie Sie getan haben, über die TreeView.
Habe versucht, was Sie erwähnt in Ihrem Bearbeiten. Hat nicht funktioniert entweder. Ich noch en tausend von jeder Kontrolle. Das ist wirklich seltsam. Und noch die CleanUpVirtualizedItem Ereignis nicht gefeuert, das ist ein weiterer Hinweis, dass die Virtualisierung nicht funktioniert.
Kein Stil irgendwo versteckt immer angewendet? Sie haben skaliert es nur noch den oben genannten code? Eine andere Sache zu versuchen ist per Datenbindung Daten gegenüber ausdrücklich hinzufügen, eins nach dem anderen...
Ok, ich bekomme es. Virtualisierung funktioniert nur mit Bindung... was ein Mist.
InformationsquelleAutor Aaron McIver
Ok, das problem ist, dass die Virtualisierung funktioniert nur, wenn der TreeView ist mit Hilfe von Verbindlichen, und nicht, wenn die Knoten erzeugt man, indem man in den code, wie mein Beispiel. Was ein Mist.
Ich mag deine Idee. Die Art und Weise werde ich wissen, wenn ich mehr Elemente beim scrollen nach oben oder unten auf dem Baum. Denken Sie, dass würde die Arbeit mit diesem Ansatz?
sicher, es sollte funktionieren
InformationsquelleAutor Carlo
Das ist nicht korrekt. Wahr ist, dass virtualuzation funktioniert nur mit Bindung, aber, wie ich beobachtet einige Beispiel-Anwendung ist, dass das recycling der Elemente auftreten, nur auf die root-Elemente des treeview.
also, wenn Sie nur 1 root-Element mit 1000 Kindern, kein recycling auftreten, da es nur 1 container zum recycling zur Verfügung stehen.
wenn Sie 100 root-Elemente, und jedes von Ihnen hat 100 Kinder, erhalten Sie teilweise das recycling, da nur der root 100 Einzelteile werden recycelt, aber die anderen 9900 untergeordneten Elemente werden im Speicher abgelegt.
natürlich das problem wird nur noch schlimmer, wenn Ihr Baum Schachtelungsebene größer ist als 2 oder 3.
Ich weiß nicht, ob es eine Lösung für dieses problem.
InformationsquelleAutor Icefront