VisualTreeHelper-Klasse
Inhaltsverzeichnis reduzieren
Inhaltsverzeichnis erweitern

VisualTreeHelper Class

Stellt Hilfsprogrammmethoden bereit, mit denen Objektbeziehungen (in Achsen von unter- und übergeordneten Objekten) in der visuellen Struktur Ihrer App durchlaufen werden können.

Vererbung

Object
  VisualTreeHelper

Syntax


public sealed class VisualTreeHelper

Attribute

[MarshalingBehavior(Agile)]
[Threading(Both)]
[Version(0x06020000)]
[WebHostHidden()]

Member

VisualTreeHelperKlasse hat diese Membertypen:

Methoden

The VisualTreeHelper Klasse hat diese Methoden. Es erbt auch Methoden von Object Klasse.

MethodeBeschreibung
DisconnectChildrenRecursive Explicitly removes all references from a target UIElement, with the goal of cleaning up reference cycles.
FindElementsInHostCoordinates(Point, UIElement) Retrieves a set of objects that are located within a specified point of an object's coordinate space.
FindElementsInHostCoordinates(Point, UIElement, Boolean) Retrieves a set of objects that are located within a specified point of an object's coordinate space.
FindElementsInHostCoordinates(Rect, UIElement) Retrieves a set of objects that are located within a specified Rect of an object's coordinate space.
FindElementsInHostCoordinates(Rect, UIElement, Boolean) Retrieves a set of objects that are located within a specified Rect of an object's coordinate space.
GetChild Using the provided index, obtains a specific child object of the provided object by examining the visual tree.
GetChildrenCount Returns the number of children that exist in an object's child collection in the visual tree.
GetOpenPopups Retrieves a collection of all open popup controls from the target Window.
GetParent Returns an object's parent object in the visual tree.

 

Hinweise

Die visuelle Struktur

Die visuelle Struktur für eine App kann als gefilterte Darstellung der größeren Objektstruktur der Objekte und Eigenschaften einer App angesehen werden. Nur die Objekte, die eine Auswirkung auf das Rendern haben, sind in einer visuellen Struktur vorhanden. Beispielsweise wäre eine Auflistungsklasse nicht Teil der visuellen Struktur. Stattdessen extrahiert die visuelle Struktur jede Auflistung in ein "untergeordnetes" Konzept.

Allerdings kann die visuelle Struktur auch Objekte enthalten, die nicht als XAML-Elemente im XAML-Markup einer Seite dargestellt werden. Dies liegt daran, dass die visuelle Struktur Objekte hinzugefügt, die Teile von zusammengesetzten Steuerelementen sind. Diese Steuerelementteile können von einer angewendeten Steuerelementvorlage stammen, die normalerweise das XAML aus einem Ressourcenwörterbuchelement oder einer Darstellung ist.

XAML-Markup und die visuelle Struktur entsprechen sich nicht genau Knoten für Knoten. Da XAML für Markup und Benutzerfreundlichkeit bei der Markupdefinition ausgelegt ist, enthält es mitunter zusätzliche Elemente. XAML verfügt beispielsweise über Eigenschaftenelemente, wodurch Eigenschaftswerte festlegt werden, wenn ein Element innerhalb eines anderen geschachtelt ist. In einer visuellen Struktur würde dies so aussehen, als ob eine Eigenschaft für ein Objekt durch ein anderes Objekt festgelegt wird. XAML verfügt auch über eine Inhaltseigenschaft, bei der die festzulegende Eigenschaft im Markup nicht explizit angegeben wird. Weitere Informationen zur spezifischen Terminologie und den Regeln für XAML finden Sie unter XAML-Übersicht.

Die visuelle Struktur wird intern für den UI-Renderingprozess verwendet. In bestimmten Szenarios – z. B. beim Schreiben oder Ersetzen einer Steuerelementvorlage oder der Analyse einer Struktur und von Teilen des Steuerelements zur Laufzeit – ist es jedoch oft wichtig, etwas über die visuelle Struktur zu wissen. Für solche Szenarien stellt die Windows-Runtime die API VisualTreeHelper bereit, die die visuelle Struktur auf eine generalisierte Weise überprüfen kann. (Sie könnten theoretisch eine solche Struktur auch mithilfe der objektspezifischen über- und untergeordneten Eigenschaften erstellen. In diesem Fall müssen Sie aber genau wissen, welche Eigenschaften von einem Element unterstützt werden. Dies lässt sich nur schwer herausfinden oder verwalten.)

Sie werden in der Regel mehrere VisualTreeHelper-API-Aufrufe kombinieren, um eigene Hilfsfunktionen zu schreiben, die die visuelle Struktur speziell für Szenarien der eigene App untersuchen.

Traversieren einer visuellen Struktur

Das Traversieren der Objektstruktur (manchmal umgangssprachlich als Walking the Tree bezeichnet) ist ein gängiges Verfahren für Objektmodelle. Sie verwenden Eigenschaften, die entweder auf untergeordnete Objekte (in der Regel sind dies Auflistungen) oder übergeordnete Beziehungen zu einem Containerobjekt (normalerweise erfolgt dies aus einer Auflistung heraus, und die Auflistung selbst wird zurückgegeben) verweisen. In groben Zügen verläuft der Prozess so, dass Sie eine Folge von unter- und übergeordneten Eigenschaften oder auch Hilfsmethoden aufrufen, um auf den Achsen der Objektstruktur zu navigieren, bis Sie einen Wert abrufen, der das gesuchte Objekt enthält. Grundsätzlich sollten Sie dazu in der Lage sein, Inhalte in XAML so zu erstellen, dass Sie die Struktur nur in seltenen Fällen abfragen müssen. Um das Durchlaufen der Struktur zu vermeiden, sollten Sie XAML-Elementen einen Wert für das Attribut x:Name / Name im XAML-Markup zuweisen, durch das sie erstellt werden. Dies erstellt einen unmittelbaren Verweis, der für Laufzeitcodezugriff verfügbar ist, und das ist ein weitaus weniger fehleranfälliges Verfahren zum Abrufen von Objektverweisen als das Durchlaufen der Struktur. Wenn Sie Objekte mit Code statt XAML erstellen, sollten Sie alternativ private Felder oder Variablen deklarieren, die Objektverweise zur Laufzeit beibehalten. Es ist in der Regel nicht erforderlich, die Struktur zu durchlaufen, um Objekte zu suchen, die in Ihrem eigenen Code erstellt werden.

In einigen Fällen ist es jedoch nicht möglich oder ungeeignet, einem Objekt einen Namen zuzuweisen und einen Objektverweis auf den Gültigkeitsbereich zu beschränken. Ein solches Szenario besteht darin, wenn Sie dynamischen Inhalt hinzufügen, der vom Benutzer oder von der Datenbindung angegeben wird, oder wenn Sie Ansichtsmodelle und Geschäftsobjekte verwenden. In diesen Fällen können Sie die Anzahl der hinzugefügten Elemente oder die Struktur eines Steuerelements und seiner untergeordneten Elementen nicht immer vorhersagen. Ein anderes Szenario ist die Untersuchung einer angewendeten Vorlage für ein Steuerelement oder für den zusammengesetzten Abschnitt eines Steuerelements oder Presenter-Inhalts.

Das Durchlaufen mehrerer Ebenen der Struktur nach unten (weg vom Stamm) kann mithilfe von GetChildrenCount für Werte ungleich 0 (null) erfolgen. Mit GetChild kann dann ein bestimmter Index angefordert werden. Sie müssen möglicherweise try/catch-Techniken oder ähnliches verwenden, wenn Sie Elemente als spezifische UIElement-Untertypen umwandeln möchten. Im Allgemeinen geben die VisualTreeHelper-APIs Elemente als DependencyObject zurück. Sie müssen es dann umwandeln, um es in nützlicher Weise zu verwenden (selbst für so einfache Vorgänge, wie das Überprüfen seines Name-Werts).

Windows 8-Verhalten

UI-Threading

Windows 8 ermöglichte VisualTreeHelper-Funktionsaufrufe, die auf Objekte im falschen (nicht aktuellen) UI-Thread verweisen. Ab Windows 8.1 löst die Funktion eine Ausnahme aus, wenn sie nicht vom aktuellen UI-Thread aufgerufen wird. Dieses neue Verhalten zu berücksichtigen sollte zu einem sehr ungewöhnlichen App-Migrationsszenario führen. Es dürfte schwierig sein, in erster Linie UI-Elemente threadübergreifend abzurufen.

Apps, die für Windows 8 kompiliert wurden, aber unter Windows 8.1 ausgeführt werden, verwenden das Windows 8.1-Verhalten und lösen den VisualTreeHelper-Funktionsaufruf statt jeden nachgeschalteten App-Code, der ein threadübergreifendes Objekt verwendet, gezielt aus.

App-UI für Bildschirmtastatur

Windows 8 hatte eine intern implementierte Logik, die eine ScrollViewer mit der gesamten App-Benutzeroberfläche verknüpfte, wenn der Benutzer die Bildschirmtastatur aufruft. Diese Bildschirmtastatur ist eine spezielle Barrierefreiheitsfunktion, die Benutzer über das Center für erleichterte Bedienung aufrufen. Sie ist nicht mit der weichen Tastatur identisch, die in App-UI für Texteingabesteuerelemente erscheinen kann, wenn das System kein Tastaturgerät erkennt. Der interne ScrollViewer ermöglicht hier, dass für den Bereich, in dem sich die App befindet, ein Bildlauf ausgeführt werden kann, wenn ein Bildlauf erzwungen wird, da die Tastatur Platz auf der Benutzeroberfläche einnimmt.

Ab Windows 8.1 weist das System weiterhin UI-/Layoutverhalten auf, wenn die Bildschirmtastatur angezeigt wird, aber es verwendet nicht mehr diesen intern erstellten ScrollViewer. Stattdessen wird ein dediziertes internes Steuerelement verwendet, das vom App-Code nicht geändert oder überprüft werden kann.

Die meisten Aspekte dieser Verhaltensänderung wirken sich nicht auf Apps aus. Allerdings hat Ihre App dieses Verhalten möglicherweise erwartet, indem sie einen impliziten Style für ScrollViewer bereitgestellt hat, um das Layout zu ändern, oder indem sie die Struktur mit VisualTreeHelper durchlief, um diesen intern erstellten ScrollViewer zu finden und ihn zur Laufzeit zu ändern. Für eine App, die für Windows 8.1 kompiliert ist, ist dieser Code nicht sinnvoll.

Apps, die für Windows 8 kompiliert wurden, jedoch unter Windows 8.1 ausgeführt werden, verwenden weiterhin das Windows 8-Verhalten.

Beispiele

Im Folgenden findet sich ein Beispiel einer Hilfsprogrammfunktion, die eine Liste untergeordneter Elemente eines bestimmten Typs aus einer visuellen Struktur kopieren kann. Es werden die grundlegende Durchlaufmethoden GetChildrenCount und GetChild verwendet. Es verwendet Rekursion, sodass Elemente unabhängig davon gefunden werden können, welche Schachtelungsebene innerhalb der Zwischencontainer vorhanden ist. Außerdem wird eine IsSubclassOf-Erweiterungsmethode von System.Reflection verwendet, die den Typvergleich erweitert und Untertypen als Übereinstimmung für einen Type berücksichtigt.


internal static void FindChildren<T>(List<T> results, DependencyObject startNode)
  where T : DependencyObject
{
    int count = VisualTreeHelper.GetChildrenCount(startNode);
    for (int i = 0; i < count; i++)
    {
        DependencyObject current = VisualTreeHelper.GetChild(startNode, i);
        if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T))))
        {
            T asType = (T)current;
            results.Add(asType);
        }
        FindChildren<T>(results, current);
    }
}

Anforderungen

Mindestens unterstützter Client

Windows 8 [Nur Windows Store-Apps]

Mindestens unterstützter Server

Windows Server 2012 [Nur Windows Store-Apps]

Namespace

Windows.UI.Xaml.Media
Windows::UI::Xaml::Media [C++]

Metadaten

Windows.winmd

 

 

Anzeigen:
© 2017 Microsoft