Bearbeitungsmodellarchitektur

Die Entwurfszeitimplementierung interagiert mit Laufzeitsteuerelementen über eine Programmierschnittstelle, die als Bearbeitungsmodell bezeichnet wird. Die Objekte, die entworfen werden, werden als bearbeitbare Objekte bezeichnet. In diesem Thema werden die Architektur und die Verwendung des Bearbeitungsmodells in WPF Designer für Visual Studio beschrieben.

Die Steuerelemente werden in Extensible Application Markup Language (XAML) definiert. Sie aktualisieren den XAML-Code für die Steuerelemente programmgesteuert mit dem Bearbeitungsmodell.

Modell, Wrapper und Ansicht

Das Bearbeitungsmodell besteht aus drei Funktionsuntereinheiten: einem Modell, einem öffentlichen Wrapper zum Abstrahieren des Modells und einer Ansicht, die die Benutzeroberfläche des Modells darstellt. Das Modell und die Ansicht sind separate Elemente, der Wrapper und das Modell stehen jedoch eng miteinander in Beziehung. In der folgenden Abbildung wird die Beziehung zwischen den drei Untereinheiten grafisch dargestellt.

Model-, ModelItem- und View-Beziehungen

Die Entwurfsumgebung verwendet den ModelItem-Typ zur Kommunikation mit dem zugrunde liegenden Modell. Alle Änderungen werden an den ModelItem-Wrappern vorgenommen, die sich auf das zugrunde liegende Modell auswirken. Dadurch kann das Modell einfach gehalten werden. Die ModelItem-Wrapper behandeln komplexe Designerfeatures, beispielsweise Transaktionsunterstützung, Verfolgen von Rückgängigfunktionen und Änderungsbenachrichtigungen.

Instanzerstellung

Jedes Designerfeature, das das Erstellen von neuen Objekten auf der Entwurfsoberfläche erfordert, verwendet die ModelFactory-Klasse. Jedes Objekt im Designer wird mit einer ModelItem-Instanz umschlossen. Modellelemente werden von einer ModelFactory erstellt.

Der folgende Code zeigt einen typischen ModelFactory-Aufruf.

ModelItem newButton = ModelFactory.CreateItem(_context, typeof(Button));

Die CreateItem-Methode gibt immer einen Datentyp von ModelItem zurück. Dies ist der Basistyp für alle Elemente im WPF-Designer-Bearbeitungsmodell und stellt eine umschlossene Instanz des an die CreateItem-Methode übergebenen Typs dar. Die CreateItem-Methode erfordert auch eine Instanz eines WPF-Designer-Bearbeitungskontexts (_context im obigen Codebeispiel), die zum Suchen anderer Dienste und Abhängigkeiten im Designer verwendet wird.

Die explizite Erstellung von Elementen durch die Factory ist für Objekte wichtig, die auf der Entwurfsoberfläche platziert werden sollen und über Standardinitialisierer verfügen. Dieses Verfahren ist nicht notwendig, wenn Sie einfach Eigenschaften für Werte festlegen.

Verwenden Sie immer die CreateItem-Methode, um neue Objekte auf der Entwurfsoberfläche zu erstellen. Dies ist erforderlich, da viele unformatierte Instanzen nicht in Modellelemente aufgelöst werden können. Sobald ein Wert im Modell festgelegt wurde, sollten Sie nur über das Modell mit dem Wert interagieren. Die Instanz, die das Modell unterstützt, kann jederzeit vom Framework neu erstellt werden, wodurch alle zwischengespeicherten Verweise ungültig werden.

Erstellungsoptionen

In manchen Fällen muss das Erstellungsverhalten der Objekte angepasst werden. Zum Beispiel führt die Datenbankverbindungskomponente zur Entwurfszeit möglicherweise keine Datenbankabfrage durch. Sie können die Erstellung von Instanzen steuern, wenn eine Komponente das erste Mal erstellt wird.

In diesem Fall wird eine Komponente aus dem Fenster Toolbox gezogen oder aus der Zwischenablage eingefügt. Sie können die Komponente mit verwendbaren Standards vorkonfigurieren. Wenn an diesen Standards keine Änderungen vorgenommen werden, werden sie in XAML serialisiert.

Sie können einen optionalen Satz von Flags mit der CreateOptions-Enumeration an die CreateItem-Methode übergeben.

Das InitializeDefaults-Flag wird von Tools wie dem Erstellungstool verwendet, um einen Satz von vorkonfigurierten Eigenschaftswerten zu initialisieren. Zum Beispiel kann ein ContentControl Standardinhalte bereitstellen. Dies ersetzt nicht das ordnungsgemäße Angeben von Standardwerten für Eigenschaften im Code des Laufzeitsteuerelements.

Die mit diesem Flag gesetzten Werte bleiben in XAML erhalten.

Dieses Flag sollte nicht vom Analysecode verwendet werden, da die Standardwerte möglicherweise während der Bearbeitung des Objekts im Designer vom Benutzer entfernt wurden.

Die CreateItem-Methode leitet den Aufruf an CreateItem weiter. Diese Methode führt mehrere, im folgenden Flussdiagramm aufgeführte Schritte aus.

Explizite Instanzerstellung mit der Erstellungs-API

Ändern des übergeordneten Elements eines Elements in einen neuen Container

Neben dem Erstellen von neuen Elementen besteht eine weitere allgemeine Aufgabe des Designers darin, das übergeordnete Element eines Elements in ein anderes Element zu ändern. Dies wird durch eine statische Klasse mit dem Namen ModelParent gehandhabt, die Features für die meisten Anforderungen übergeordneter Elemente bereitstellt.

  • Suchen nach einem gültigen übergeordneten Objekt bei einem gegebenen Koordinatenoffset oder Startelement in der Hierarchie für die Suche

  • Bestimmen, ob ein gegebenes Objekt ein übergeordnetes Element eines bestimmten Typs sein kann

  • Ändern des übergeordneten Elements eines Objekts in ein anderes Element. Bei dieser Änderung wird auch das alte übergeordnete Element aus dem Objekt entfernt. Dies ermöglicht dem alten übergeordneten Element, alle Daten zu entfernen, die möglicherweise im Element enthalten sind (beispielsweise angefügte Eigenschaften).

Die ModelParent-Klasse sucht eine ParentAdapter-Klasse für aktuelle und beabsichtigte übergeordnete Objekte. Wenn keine ParentAdapter-Klasse vorhanden ist, kann ein Objekt nicht einem übergeordneten Element zugewiesen werden. Die ParentAdapter-Klasse definiert mehrere Überschreibungen für häufig auftretende Fälle. Zum Beispiel akzeptieren viele Überschreibungen ein GestureData-Objekt als Parameter. Dieser Datentyp steht im WPF-Designer-Befehlsmechanismus zur Verfügung, wenn im Code ein Benutzerbefehl behandelt wird. Er stellt allgemeine Kontextinformationen bereit.

Der ParentAdapter lässt das intelligente Entfernen von übergeordneten Elementen durch Container zu. Wenn z. B. ein Objekt mit einem übergeordneten Canvas-Steuerelement in ein übergeordnetes Grid-Steuerelement geändert wird, können die angefügten Eigenschaften des Canvas-Steuerelements im Objekt automatisch entfernt werden.

Siehe auch

Referenz

EditingContext

Microsoft.Windows.Design.Services

GestureData

Weitere Ressourcen

WPF-Designer-Erweiterbarkeit