Serialisierungseinschränkungen für XamlWriter.Save

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

Laufzeit-, statt Entwurfszeitdarstellung

Die grundlegende Strategie dafür, was durch einen Aufruf von Save serialisiert wird, liegt darin, dass das Ergebnis eine Darstellung des serialisierten Objekts zur Laufzeit sein wird. Viele Entwurfszeiteigenschaften der ursprünglichen XAML-Datei sind möglicherweise zu dem Zeitpunkt, an dem die XAML als Objekt im Arbeitsspeicher geladen wird, bereits optimiert oder verloren und werden nicht beibehalten, wenn Sie Save zur Serialisierung aufrufen. Das serialisierte Ergebnis ist eine effektive Darstellung der konstruierten logischen Struktur der Anwendung, aber nicht notwendigerweise das ursprünglichen XAML, mit dem es erstellt wurde. Diese Probleme machen es extrem schwierig, die Save-Serialisierung als Teil einer umfassenden XAML-Entwurfsoberfläche zu verwenden.

Die Serialisierung ist in sich geschlossen

Die serialisierte Ausgabe von Save ist in sich geschlossen. Alles, was serialisiert wird, ist in einer einzelnen XAML-Seite mit einem einzelnen Stammelement und keinen externen Verweise außer URIs enthalten. Wenn Ihre Seite beispielsweise auf Ressourcen aus Anwendungsressourcen verweist, werden diese so angezeigt, als handele es sich um eine Komponente der serialisierten Seite.

Erweiterungsverweise werden dereferenziert

Allgemeine Verweise auf Objekte durch verschiedene Markuperweiterungsformate, z.B. StaticResource oder Binding, werden durch den Serialisierungsprozess dereferenziert. Diese wurden bereits zu dem Zeitpunkt dereferenziert, als die Objekte im Arbeitsspeicher durch die Anwendungslaufzeit erstellt wurden, und die Save-Logik kehrt nicht mehr zum ursprünglichen XAML zurück, um solche Verweise auf die serialisierte Ausgabe wiederherzustellen. Dadurch werden möglicherweise alle datengebundenen oder aus Ressourcen abgerufenen Werte auf den zuletzt zur Darstellung der Laufzeit verwendeten Wert gesperrt. Ein solcher Wert kann nur eingeschränkt oder indirekt von anderen lokal festgelegten Werten unterschieden werden. Bilder werden ebenfalls als Objektverweise auf Bilder serialisiert, da sie im Projekt und nicht als ursprüngliche Quellenverweise enthalten sind. Dabei verlieren sie den Dateinamen oder den URI, auf den ursprünglich verwiesen wurde. Sogar Ressourcen, die auf der selben Seite deklariert werden, werden an den Punkt serialisiert, von dem aus auf sie verwiesen wird, und bleiben nicht als Schlüssel einer Ressourcenauflistung erhalten.

Ereignisbehandlung wird nicht beibehalten

Wenn Ereignishandler, die durch XAML hinzugefügt wurden, serialisiert werden, werden diese nicht beibehalten. XAML ohne CodeBehind (und auch ohne den zugehörigen x:Code-Mechanismus) kann keine prozedurale Logik zur Laufzeit serialisieren. Da die Serialisierung in sich geschlossen und auf die logische Struktur beschränkt ist, besteht keine Möglichkeit zur Speicherung der Ereignishandler. Folglich werden bei Ereignishandlerattributen sowohl das Attribut selbst als auch der Zeichenfolgenwert, der den Handler benennt, aus dem Ausgabe-XAML entfernt.

Realistische Szenarios für die Verwendung von XAMLWriter.Save

Während die hier aufgeführten Einschränkungen ziemlich umfangreich sind, gibt es noch mehrere Szenarien, in denen Save für die Serialisierung geeignet ist.

  • Vektorausgabe oder grafische Ausgabe: Die Ausgabe des gerenderten Bereichs kann dazu verwendet werden, den gleichen Vektor oder die gleichen Grafiken beim erneuten Laden zu reproduzieren.

  • Rich-Text und Flussdokumente: Text und alle darin enthaltenen Elementformatierungen und Elementeinschlüsse werden in der Ausgabe beibehalten. Dies kann für Mechanismen nützlich sein, die einer Zwischenablagefunktionalität ähneln.

  • Erhalten von Daten für Geschäftsobjekte: Wenn Sie Daten in benutzerdefinierten Elementen (z. B. XML-Daten) gespeichert haben, können diese Geschäftsobjekte durch Serialisierung beibehalten werden. Voraussetzung hierfür ist, dass bei den Geschäftsobjekten grundlegende XAML-Regeln befolgt werden, etwa das Bereitstellen von benutzerdefinierten Konstruktoren und das Konvertieren für durch Verweis übergebene Eigenschaftswerte.