Freigeben über


Serialisierungseinschränkungen von XamlWriter.Save

Die API-Save kann verwendet werden, um den Inhalt einer Windows Presentation Foundation (WPF)-Anwendung als XAML-Datei (Extensible Application Markup Language) zu serialisieren. Es gibt jedoch einige wichtige Einschränkungen bei genau dem, was serialisiert wird. Diese Einschränkungen und einige allgemeine Überlegungen sind in diesem Thema dokumentiert.

Laufzeit, nicht Design-Time Darstellung

Die grundlegende Philosophie hinter dem, was durch einen Aufruf von Save serialisiert wird, ist, dass das Ergebnis zur Laufzeit eine Darstellung des zu serialisierenden Objekts ist. Viele Entwurfszeiteigenschaften der ursprünglichen XAML-Datei können bereits optimiert oder verloren gegangen sein, wenn die XAML als Speicherobjekte geladen wird und nicht erhalten bleiben, wenn Sie Save zum Serialisieren aufrufen. Das serialisierte Ergebnis ist eine effektive Darstellung der konstruierten logischen Struktur der Anwendung, aber nicht unbedingt des ursprünglichen XAML, das sie erzeugt hat. Diese Probleme erschweren die Verwendung der Save-Serialisierung als Teil einer umfangreichen XAML-Entwurfsoberfläche.

Serialisierung ist Self-Contained

Die serialisierte Ausgabe von Save ist eigenständig; alles, was serialisiert wird, ist in einer einzelnen XAML-Seite mit einem einzelnen Stammelement und keine externen Verweise außer URIs enthalten. Wenn ihre Seite beispielsweise von Anwendungsressourcen auf Ressourcen verwiesen hat, werden diese so angezeigt, als wären sie eine Komponente der Serialisierung der Seite.

Erweiterungsverweise werden dereferenziert

Allgemeine Verweise auf Objekte, die von verschiedenen Markup-Erweiterungsformaten wie StaticResource oder Bindingstammen, werden durch den Serialisierungsprozess aufgelöst. Diese Verweise wurden bereits zum Zeitpunkt der Erstellung von In-Memory-Objekten durch die Anwendungslaufzeit dereferenziert, und die Save-Logik überprüft nicht den ursprünglichen XAML-Code, um solche Verweise im serialisierten Output wiederherzustellen. Dadurch werden potenziell alle datengebundenen oder ressourcenbezogenen Werte eingefroren, die zuletzt von der Laufzeitdarstellung verwendet wurden, wobei nur eine begrenzte oder indirekte Möglichkeit besteht, einen solchen Wert von jedem anderen lokal festgelegten Wert zu unterscheiden. Bilder werden auch als Objektverweise serialisiert, wie sie im Projekt existieren, anstatt als ursprüngliche Quellverweise, wodurch der ursprünglich referenzierte Dateiname oder die URI verloren geht. Selbst Ressourcen, die auf derselben Seite deklariert sind, werden bis zu dem Punkt serialisiert, an dem auf sie verwiesen wurde, anstatt als Schlüssel einer Ressourcensammlung beibehalten zu werden.

Das Event-Handling wird nicht beibehalten.

Wenn Ereignishandler, die über XAML hinzugefügt werden, serialisiert werden, werden sie nicht beibehalten. XAML ohne CodeBehind (und auch ohne den zugehörigen x:Code-Mechanismus) verfügt nicht über die Serialisierung der Laufzeitprozedurlogik. Da die Serialisierung eigenständig und auf die logische Struktur beschränkt ist, gibt es keine Möglichkeit zum Speichern der Ereignishandler. Daher werden Ereignishandlerattribute, sowohl das Attribut selbst als auch der Zeichenfolgenwert, der den Handler benennt, aus dem Ausgabe-XAML entfernt.

Realistische Szenarien für die Verwendung von XAMLWriter.Save

Die hier aufgeführten Einschränkungen sind zwar relativ erheblich, es gibt jedoch noch mehrere geeignete Szenarien für die Verwendung von Save für die Serialisierung.

  • Vektor- oder grafische Ausgabe: Die Ausgabe des gerenderten Bereichs kann verwendet werden, um denselben Vektor oder dieselbe Grafik zu reproduzieren, wenn sie neu geladen wird.

  • Rich-Text- und Fließtextdokumente: Der Text sowie die Formatierung und das Einfügen aller darin enthaltenen Elemente werden in der Ausgabe beibehalten. Dies kann für Mechanismen nützlich sein, die eine Zwischenablagefunktion nachahmen.

  • Beibehalten von Geschäftsobjektdaten: Wenn Sie Daten in benutzerdefinierten Elementen gespeichert haben, z. B. XML-Daten, und Ihre Geschäftsobjekte grundlegende XAML-Regeln befolgen, wie z. B. das Bereitstellen von benutzerdefinierten Konstruktoren und Konvertierungen für Referenzeigenschaftswerte, können diese Geschäftsobjekte durch Serialisierung bewahrt werden.