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 der Serialisierung durch einen Aufruf Save besteht darin, dass das Ergebnis eine Darstellung des Objekts sein wird, das zur Laufzeit serialisiert wird. Viele Entwurfszeiteigenschaften der ursprünglichen XAML-Datei können bereits optimiert oder verloren gehen, wenn der XAML-Code als In-Memory-Objekte geladen wird und nicht beibehalten werden, wenn Sie Save zur Serialisierung 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 enthalten, mit einem einzelnen Stammelement, und es gibt keine externen Verweise außer URIs. Wenn Ihre Seite beispielsweise auf Ressourcen der Anwendung verweist, erscheinen diese so, als wären sie eine Komponente der zu serialisierenden Seite.

Erweiterungsverweise werden entreferenziert

Allgemeine Verweise auf Objekte, die von verschiedenen Markuperweiterungsformaten erstellt werden, wie StaticResource oder Binding, werden vom Serialisierungsprozess aufgelöst. Diese wurden bereits zu dem Zeitpunkt, als die In-Memory-Objekte vom Anwendungsruntime erstellt wurden, dereferenziert, und die Save-Logik überprüft den ursprünglichen XAML-Code nicht erneut, um solche Verweise in die serialisierte Ausgabe 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 auf die im Projekt vorhandenen Bilder serialisiert, anstelle der ursprünglichen Quellverweise, wodurch der ursprünglich referenzierte Dateiname oder URI verloren geht. Selbst ressourcen, die auf derselben Seite deklariert sind, werden in den Punkt serialisiert, an dem auf sie verwiesen wurde, anstatt als Schlüssel einer Ressourcenauflistung beibehalten zu werden.

Die Ereignisbehandlung 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

Obwohl die hier aufgeführten Einschränkungen relativ erheblich sind, gibt es dennoch mehrere geeignete Szenarien für die Verwendung von Save zur 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 Flussdokumente: Text und alle Darin enthaltenen Elemente werden in der Ausgabe beibehalten. Dies kann für Mechanismen nützlich sein, die eine Zwischenablagefunktion simulieren.

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