Strukturen in WPF
Aktualisiert: November 2007
In vielen Technologien sind Elemente und Komponenten in einer Struktur angeordnet, die Entwickler direkt bearbeiten können, um das Rendering einer Anwendung zu beeinflussen. Windows Presentation Foundation (WPF) verwendet ebenfalls verschiedene Strukturmodelle, um Beziehungen zwischen Programmelementen zu definieren.
Dieses Thema enthält folgende Abschnitte.
- Strukturen in WPF
- Die logische Struktur
- Die visuelle Struktur
- Strukturen, Inhaltselemente und Inhaltshosts
- Strukturdurchlauf
- Routen für Routingereignisse in Form einer "Struktur"
- Ressourcen und Strukturen
- Verwandte Abschnitte
Strukturen in WPF
Die primäre Struktur in WPF ist die Elementstruktur. Wenn Sie eine Anwendungsseite in XAML erstellen, wird die Struktur basierend auf den Schachtelungsbeziehungen der Elemente in Markup erstellt. Wenn Sie eine Anwendung per Code erstellen, wird die Struktur basierend darauf erstellt, wie Sie Eigenschaftenwerte für Eigenschaften zuweisen, die das Inhaltsmodell für ein bestimmtes Element implementieren. In Windows Presentation Foundation (WPF) kann die Elementstruktur auf zwei Arten verarbeitet und angelegt werden: als logische Struktur und als visuelle Struktur. Die Unterschiede zwischen logischer Struktur und visueller Struktur sind nicht immer von großer Wichtigkeit, aber es können gelegentlich Probleme mit bestimmten WPF-Subsystemen oder bei bestimmten Auswahlen in Markup oder Code auftreten.
Obwohl Sie die logische oder die visuelle Struktur nicht immer direkt bearbeiten, hilft Ihnen die Kenntnis der Interaktion von Strukturen dabei, die Funktionsweise der Eigenschaftenvererbung und des Ereignisroutings in WPF zu verstehen.
Die logische Struktur
In WPF fügen Sie Elementen Inhalt mithilfe von Eigenschaften hinzu. Zum Beispiel fügen Sie Elemente einem ListBox-Steuerelement hinzu, indem Sie seine Items-Eigenschaft verwenden. Dabei fügen Sie Elemente in die ItemCollection des ListBox-Steuerelements ein. Um Elemente einem DockPanel-Element hinzuzufügen, verwenden Sie seine Children-Eigenschaft. Hier fügen Sie Elemente der UIElementCollection des DockPanel-Elements hinzu. Ein Codebeispiel finden Sie unter Gewusst wie: Dynamisches Hinzufügen eines Elements.
Wenn Sie in Extensible Application Markup Language (XAML) Listenelemente in ein ListBox-Element oder Steuerelemente oder andere Elemente in ein DockPanel-Element einfügen, verwenden Sie die Eigenschaften Items und Children wie im folgenden Beispiel (entweder explizit oder implizit).
<DockPanel
Name="ParentElement"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
>
<!--implicit: <DockPanel.Children>-->
<ListBox DockPanel.Dock="Top">
<!--implicit: <ListBox.Items>-->
<ListItem>
<Paragraph>Dog</Paragraph>
</ListItem>
<ListItem>
<Paragraph>Cat</Paragraph>
</ListItem>
<ListItem>
<Paragraph>Fish</Paragraph>
</ListItem>
<!--implicit: </ListBox.Items>-->
</ListBox>
<Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>
<!--implicit: </DockPanel.Children>-->
</DockPanel>
Beachten Sie, dass die Eigenschaftenelementtags nicht zwingend erforderlich sind, da der XAML-Reader die Eigenschaftenelemente beim Erstellen der Objekte ableitet, die für die ausführbare Datei die Laufzeitobjektdarstellung der Anwendung erstellen. Weitere Informationen dazu, wie die XAML-Syntax der erstellten logischen Struktur zugeordnet ist, sowie zu abgeleiteten Tags finden Sie unter Terminologie der XAML-Syntax oder Übersicht über XAML. Die folgende Grafik zeigt eine konzeptuelle Übersicht der logischen Struktur, die zur Laufzeit erstellt wird (die Verzweigung für die Schaltfläche ist in der Grafik nicht dargestellt).
Schematische Darstellung einer generischen logischen Struktur
Der Zweck der logischen Struktur
Die logische Struktur wird verwendet, damit Inhaltsmodelle ihre potenziellen untergeordneten Elemente auf einfache Weise durchlaufen können und damit Inhaltsmodelle erweiterbar sind. Außerdem stellt die logische Struktur einen Framework für bestimmte Benachrichtigungen bereit, z. B. wenn alle Elemente in der logischen Struktur geladen sind.
Außerdem werden Ressourcenverweise aufgelöst, indem in der logischen Struktur in Aufwärtsrichtung im anfordernden Element und dann in den übergeordneten Elementen nach Resources-Auflistungen gesucht wird. Die logische Struktur wird für die Ressourcensuche verwendet, wenn sowohl die logische Struktur als auch die visuelle Struktur vorhanden ist. Weitere Informationen zu Ressourcen finden Sie unter Übersicht über Ressourcen.
Überschreiben der logischen Struktur
Entwickler von erweiterten Steuerelementen können die logische Struktur überschreiben, indem sie mehrere APIs überschreiben, die definieren, wie ein allgemeines Objekt- oder Inhaltsmodell Elemente in der logischen Struktur hinzufügt oder entfernt. Ein Beispiel für die Überschreibung der logischen Struktur finden Sie unter Gewusst wie: Überschreiben der logischen Struktur.
Vererbung von Eigenschaftenwerten
Die Vererbung von Eigenschaftenwerten wird mithilfe einer Hybridstruktur durchgeführt. Die eigentlichen Metadaten, in denen die Inherits-Eigenschaft enthalten ist, die die Vererbung von Eigenschaften ermöglicht, ist die FrameworkPropertyMetadata-Klasse der WPF-Frameworkebene. Aus diesem Grund muss sowohl das übergeordnete Element, das den Ursprungswert enthält, als auch das untergeordnete Element, das den Wert erbt, den Typ FrameworkElement oder FrameworkContentElement aufweisen. Außerdem müssen beide Elemente Teil einer logischen Struktur sein. Die logische Struktur mit übergeordnetem und untergeordnetem Element kann jedoch unzusammenhängend sein, so dass die Vererbung von Eigenschaftenwerten über ein dazwischen liegendes visuelles Element weitergegeben werden kann, das nicht Teil einer logischen Struktur ist. Damit die Vererbung von Eigenschaftenwerten über eine Grenze dieser Art konsistent durchgeführt werden kann, muss die erbende Eigenschaft als angefügte Eigenschaft registriert sein. Die genaue Struktur, die für die Vererbung von Eigenschaften verwendet wird, kann von einer Hilfsklassen-Dienstmethode nicht vorausgesehen werden, auch nicht zur Laufzeit. Weitere Informationen finden Sie unter Vererbung von Eigenschaftenwerten.
Die visuelle Struktur
Zusätzlich zum Begriff der logischen Struktur gibt es in WPF auch den Begriff der visuellen Struktur. Die visuelle Struktur beschreibt die Struktur von visuellen Objekten, die von der Visual-Basisklasse dargestellt werden. Wenn Sie für ein Steuerelement eine Vorlage schreiben, definieren Sie die visuelle Struktur (bzw. definieren diese neu), die für das Steuerelement gilt. Die visuelle Struktur ist auch für Entwickler interessant, die aus Leistungs- und Optimierungsgründen eine weniger umfangreiche Zeichnungssteuerung bevorzugen. Eine Art der Offenlegung der visuellen Struktur als Teil der herkömmlichen WPF-Anwendungsprogrammierung besteht darin, dass die Ereignisrouten für ein Routingereignis meist entlang der visuellen Struktur verlaufen, nicht entlang der logischen Struktur. Dieses Detail des Verhaltens von Routingereignissen ist nicht offensichtlich, besonders wenn Sie kein Entwickler von Steuerelementen sind. Das Routing über die visuelle Struktur ermöglicht es Steuerelementen, die die Komposition auf der visuellen Ebene implementieren, Ereignisse zu behandeln oder Ereignissetter zu erstellen.
Strukturen, Inhaltselemente und Inhaltshosts
Inhaltselemente (Klassen, die von ContentElement abgeleitet sind) sind nicht Teil der visuellen Struktur. Sie erben nicht von Visual und weisen keine visuelle Darstellung auf. Um auf einer Benutzeroberfläche überhaupt angezeigt zu werden, muss ContentElement von einem Inhaltshost gehostet werden, bei dem es sich sowohl um ein Visual-Element und ein Element einer logischen Struktur handelt. In der Regel ist dies ein FrameworkElement. Sie können es sich so vorstellen, dass der Inhaltshost für den Inhalt eine Art "Browser" darstellt und wählt, wie der Inhalt innerhalb des Bildschirmbereichs angezeigt wird, den der Host steuert. Wenn der Inhalt gehostet wird, kann der Inhalt zu einem Teilnehmer von bestimmten Strukturabläufen gemacht werden, die normalerweise der visuellen Struktur zugeordnet sind. Im Allgemeinen enthält die FrameworkElement-Hostklasse Implementierungscode, der ein gehostetes ContentElement der Ereignisroute jeweils über Unterknoten der logischen Inhaltsstruktur hinzufügt. Dabei macht es nichts, dass der gehostete Inhalt nicht Teil der wahren visuellen Struktur ist. Dies ist erforderlich, damit ein ContentElement ein Routingereignis finden kann, dessen Weiterleitung an alle Elemente außer sich selbst erfolgt.
Strukturdurchlauf
Die LogicalTreeHelper-Klasse stellt für das Durchlaufen der logischen Struktur die Methoden GetChildren, GetParent und FindLogicalNode bereit. In den meisten Fällen sollte es nicht erforderlich sein, dass Sie die logische Struktur von vorhandenen Steuerelementen durchlaufen, da diese Steuerelemente ihre logischen untergeordneten Elemente fast ausschließlich als dedizierte Auflistungseigenschaft offenlegen, die Auflistungs-APIs wie "Add", einen Indexer usw. unterstützt. Der Strukturdurchlauf wird vor allem von Steuerelemententwicklern verwendet, die nicht von den geplanten Steuerelementmustern abweichen möchten, z. B. ItemsControl oder Panel, für die Auflistungseigenschaften bereits definiert sind, und die ihre eigene Unterstützung für Auflistungseigenschaften bereitstellen möchten.
Die visuelle Struktur unterstützt ebenfalls eine Hilfsklasse für das Durchlaufen der visuellen Struktur, und zwar VisualTreeHelper. Die visuelle Struktur wird über steuerelementspezifische Eigenschaften nicht auf sehr benutzerfreundliche Weise offengelegt. Aus diesem Grund ist die VisualTreeHelper-Klasse zu empfehlen, um die visuelle Struktur zu durchlaufen, falls dies in Ihrem Programmierszenario erforderlich ist. Weitere Informationen finden Sie unter Übersicht über das Grafikrendering in Windows Presentation Foundation.
Routen für Routingereignisse in Form einer "Struktur"
Wie bereits erwähnt, verläuft die Route für ein Routingereignis praktisch entlang einer Struktur, entweder in Aufwärts- oder in Abwärtsrichtung, je nachdem, ob es sich um ein Tunneling- oder Bubbling-Routingereignis handelt. Das Ereignisroutenverfahren verfügt nicht über eine direkt unterstützende Hilfsklasse, die verwendet werden könnte, um die Ereignisroute unabhängig vom Auslösen eines entsprechenden Ereignisses zu durchlaufen. Es gibt eine Klasse, die die Route darstellt (EventRoute), aber die Methoden dieser Klasse sind normalerweise nur für die interne Verwendung gedacht.
Ressourcen und Strukturen
Bei der Ressourcensuche wird praktisch die logische Struktur durchlaufen. Objekte, die sich nicht in der logischen Struktur befinden, können auf Ressourcen verweisen, aber die Suche beginnt an dem Punkt, an dem das Objekt mit der logischen Struktur verbunden ist. Nur die Knoten einer logischen Struktur können über eine Resources-Eigenschaft verfügen, die ein ResourceDictionary enthält. Aus diesem Grund ergibt es keinen Sinn, die visuelle Struktur auf der Suche nach Ressourcen zu durchlaufen.
Die Ressourcensuche kann jedoch auch über die unmittelbare logische Struktur hinaus durchgeführt werden. Beim Erstellen von Markup für Anwendungen kann die Ressourcensuche dann weiter zu Anwendungsressourcen und zu Designunterstützungs- und Systemwerten verlaufen. Designs können auch selbst auf Systemwerte außerhalb der logischen Designstruktur verweisen, wenn die Ressourcenverweise dynamischer Natur sind. Weitere Informationen zu Ressourcen und zur Suchlogik finden Sie unter Übersicht über Ressourcen.
Siehe auch
Konzepte
Übersicht über das Grafikrendering in Windows Presentation Foundation
Übersicht über Routingereignisse
Initialisierung für Objektelemente außerhalb einer Elementstruktur