Wie das Panel in einem treeview (WPF) erhalten
-
03-10-2019 - |
Frage
Wie kann man erhält die Platte, die innerhalb eines TreeView
verwendet wird? Ich habe standardmäßig TreeView
verwendet einen VirtualizingStackPanel
dafür lesen, dass. Als ich an einer TreeView
Vorlage sehen, alles, was ich sehe, ist
Mögliche Lösungen:
1) Auf der Treeview-Instanz ( "tv"), von Code, dies zu tun:. Tv.ItemsPanel
Das Problem ist, das nicht wieder eine Platte, sondern ein Itemspaneltemplate ( „Ruft die Vorlage, die definiert die Platte, dass die Kontrollen des Layout der Elemente“).
2) Machen Sie eine TreeView-Vorlage, die explizit ersetzt
(Ich verwende ein Steuerelement mit dem Namen VirtualTreeView, die von TreeView abgeleitet wird, wie weiter unten zu sehen ist):
<ControlTemplate x:Key="VirtualTreeViewTemplate" TargetType="{x:Type local:VirtualTreeView}">
<Border>
<local:VirtualScrollViewer
Style="{StaticResource VirtualScrollViewer}"
x:Name="PART_VirtualScrollViewer"
CanContentScroll="True">
<!-- instead of: <ItemsPresenter />, use following: -->
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel
Name="PART_ItemsStackPanel"
IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</local:VirtualScrollViewer>
</Border>
</ControlTemplate>
[I gezupft alle Unordnung hier für die Sichtbarkeit ...]
Das Problem dabei ist: dies sofort überschreibt alle TreeView Layout-Mechanismus. Eigentlich bekommt man nur einen leeren Bildschirm, auch wenn Sie TreeViewItems Füllen des Baumes haben. Nun, der Grund, warum ich einen Halt der Platte bekommen möchten, ist nehmen einige an der MeaureOverride, aber ohne all das geht in, ich sicherlich nicht wollen, dass das Buch, wie man das Layout neu zu schreiben ein treeview. Das heißt, dies ist der Schritt zu tun # 2 Weg scheint den Punkt sogar mit einem TreeView in erster Linie ungültig zu machen.
Sorry, wenn es einige Verwirrung hier, vielen Dank für jede Hilfe können Sie anbieten.
Lösung
Es gibt eine Klasse namens VisualTreeHelper
, die Sie erlaubt nicht exponierten Kind Kontrollen zu bekommen / Elemente einer Kontrolle.
Hier ist ein Link auf die GetChild
Methode für diese Klasse mit dem Sie alle Kinder aufzählen können, etc:
http://msdn.microsoft .com / de-de / library / system.windows.media.visualtreehelper.getchild.aspx
Andere Tipps
Im Folgenden ist eine Ergänzung zur Antwort von David oben. Dies bietet eine Möglichkeit, alle Visual Kinder zu bekommen, die UIElement
s über ein Verlängerungsverfahren sind.
public static class WPFXtensions
{
static public IEnumerable<UIElement> GetDescendantUIElements(this UIElement uiElement)
{
int childrenCnt = VisualTreeHelper.GetChildrenCount(uiElement);
for (int i = 0; i < childrenCnt; i++)
{
Visual childVisual = VisualTreeHelper.GetChild(uiElement, i) as Visual;
if(childVisual == null)
continue;
if (childVisual is UIElement)
{
yield return childVisual as UIElement;
// note: by recursively calling within the loop, we walk the tree all the way down for each
// UIElement encountered before moving to the next UIElement sibling.
foreach (UIElement e in GetDescendantUIElements(childVisual as UIElement))
yield return e;
}
}
}
}
// Use this then like this to retrieve an expected child StackPanel
StackPanel sp1 = (StackPanel)this.GetDescendantUIElements()
.First(uiElem => uiElem is StackPanel);
// Get all of this UIElement's descendants (for a diagnostic look);
// In a run where this was a TreeView, 78 UIElements returned
List<UIElement> uiElements = this.GetDescendantUIElements().ToList();