Сериализация ограничений XamlWriter.Save
API Save Может использоваться для сериализации содержимого Windows Presentation Foundation (WPF) под XAML файл. Однако существуют некоторые заметные ограничения в том, что именно подлежит сериализации. В данном разделе описаны эти ограничения и некоторые общие рекомендации.
Представление во время выполнения, а не во время разработки
Основные принципы что подлежит сериализации при вызове Save том, что результат будет представление сериализуемого во время выполнения объекта. Многие свойства времени разработки первоначального XAML файл уже может быть оптимизированы или потеряны к тому времени, XAML загружается как объекты в памяти и не сохраняются при вызове Save для сериализации. Результат сериализации — эффективное представление построенного логического дерева приложения, но не обязательно исходного XAML, который его создал. Эти проблемы затрудняют использование Save сериализации как части обширной XAML область конструктора.
Сериализация самодостаточна
Сериализованные выходные данные Save самодостаточны; все, что сериализовано, содержится внутри XAML одну страницу, с единственный корневой элемент и без внешних ссылок, отличных от URI. Например, если страницы ссылаются на ресурсы из ресурсов приложения, они будут отображаться, как если бы они были компонентом сериализуемой страницы.
Ссылки на расширения разыменовываются
Общие ссылки на объекты, сделанные различными форматами расширения разметки, такие как StaticResource
или Binding
, будут разыменованы в процессе сериализации. Они уже были разыменованы во время создания объектов в памяти при выполнении приложения и Save логики не к повторному посещению исходного XAML для восстановления таких ссылок для сериализованных выходных данных. Это потенциально замораживает любое значение, полученное из привязки данных или ресурсов, которое в последний раз использовалось представлением во время выполнения, и остается только ограниченная или косвенная возможность отличать такое значение от любого другого значения, установленного локально. Образы сериализуются как ссылки объектов на изображения в том виде, в котором они существуют в проекте, а не как исходные ссылки на источники, теряя изначально указанные ссылками имя файла или URI. Ресурсы, объявленные на одной странице, воспринимаются как сериализованные в том месте, где они были указаны ссылками, а не сохраняются как ключ коллекции ресурсов.
Обработка событий не сохраняется
Если обработчики событий, которые добавляются с помощью XAML, будут сериализованы, то они не сохранятся. XAML без кода (и без механизма связанных x: Code) не имеет возможности сериализовать процедурную логику времени выполнения. Поскольку сериализация является самодостаточной и ограничивается логическим деревом, не существует средств для хранения обработчиков событий. В результате атрибуты обработчика событий (и атрибут, и строковое значение имени обработчика) удаляются из выходных данных XAML.
Реалистичные сценарии использования XAMLWriter.Save
Хотя ограничения, перечисленные здесь, являются достаточно значительными, существует еще несколько подходящих сценариев использования Save для сериализации.
Вектор или графического вывода: Выходные данные для просмотра области можно использовать для воспроизведения того же вектора или графики при перезагрузке.
Форматированный текст и потоковые документы: Текст и все форматирование и элемент вложение элементов внутри него сохраняются в выходных данных. Это может быть полезно для механизмов, которые аппроксимируют функциональность буфера обмена.
Сохранение данных бизнес-объекта: Если вы сохранили данные в пользовательских элементах, такие как XML данных, условии, что бизнес-объекты соответствуют базовым XAML правил, таких как предоставление настраиваемых конструкторов и преобразование значений свойств по ссылке, эти бизнес-объектов может быть сохранены посредством сериализации.