Класс XAMLServices и чтение или запись базового кода XAML
XamlServices — это класс, предоставляемый службами XAML платформы .NET Framework, который можно использовать для обращения к сценариям XAML, которым не требуется отдельный доступ к потоку узлов XAML или к сведениям о системе типов XAML, получаемым от этих узлов. В целом API XamlServices можно описать следующим образом: Load или Parse для поддержки пути загрузки XAML, Save для поддержки пути сохранения XAML и Transform для предоставления метода объединения путей сохранения и загрузки. Transform можно использовать для изменения одной схемы XAML на другую. В данном разделе собраны все классификации этих API и описываются различия между конкретными перезагруженными версиями методов.
В этом разделе содержатся следующие подразделы.
- Загрузка
- Разбор
- Сохранить
- Transform
- Связанные разделы
Загрузка
Различные перегрузки метода Load полностью реализуют логику пути загрузки. Путь загрузки получает XAML в некотором виде и выводит поток узлов XAML. Большинство этих путей загрузки получает XAML в виде кодированного текстового файла XML. Однако также можно загрузить обычный поток или загрузить предварительно загруженный источник XAML, уже содержащийся в другой реализации XamlReader.
Простейшей перегрузкой для большинства сценариев является метод Load(String). Эта перегрузка содержит параметр fileName, который просто является именем текстового файла, содержащего предназначенный для загрузки код XAML. Это соответствует сценариям приложений, таким как приложения полного доверия, ранее выполнившие сериализацию состояния или данных на локальный компьютер. Она также полезна для платформ, в которых разработчик определяет модель приложения и хочет загрузить один из стандартных файлов, определяющих поведение приложения, первоначальный пользовательский интерфейс или другие определяемые платформой возможности, использующие XAML.
Сценарии применения Load(Stream) аналогичны. Эта перегрузка может быть полезна, если пользователю предоставляется возможность выбора файлов для загрузки, так как Stream часто является выходным объектом других API-интерфейсов System.IO, которые могут получать доступ к файловой системе. Либо можно получать доступ к источникам XAML, используя асинхронные операции загрузки или другие сетевые способы, также обеспечивающие поток данных. (Загрузка из потока или выбранного пользователем источником может вызывать некоторые проблемы безопасности. Дополнительные сведения см. в разделе Соображения безопасности XAML.)
Load(TextReader) и Load(XmlReader) — это перегрузки, использующие средства чтения форматов предыдущих версий платформы .NET Framework. Для использования этих перегрузок следует сначала создать экземпляр средства чтения и воспользоваться его API Create, чтобы загрузить XAML в соответствующем виде (текст или XML). Если указатели записей в других средствах чтения уже перемещены или с ними выполнены другие операции, это не имеет значения. Логикой пути загрузки из метода Load всегда обрабатываются все входные данные XAML от корневой папки и ниже. К сценариям таких перегрузок могут относиться следующие.
Рабочие области конструирования, где предоставляется возможность простого редактирования XAML из существующего текстового редактора для XML.
Варианты основных сценариев применения System.IO, где для открытия файлов или потоков используются выделенные средства чтения. Пользовательская логика выполняет элементарную проверку или обработку содержимого, прежде чем загружать его в качестве XAML.
Можно либо загрузить файл или поток, либо загрузить средство чтения XmlReader, TextReader или XamlReader, обеспечивающее оболочку для входных данных XAML путем загрузки с помощью API-интерфейсов средства чтения.
Внутренне каждая из указанных выше перегрузок в конечном счете является методом Load(XmlReader), а переданное средство чтения XmlReader используется для создания нового средства чтения XamlXmlReader.
Сигнатурой метода Load, предназначенной для более сложных сценариев, является Load(XamlReader). Эту сигнатуру можно использовать в одном из следующих случаев.
Разработчик определил собственную реализацию средства чтения XamlReader.
Для XamlReader понадобится задать параметры, которые могут отличаться от параметров по умолчанию.
Примеры параметров, не являющихся параметрами по умолчанию: AllowProtectedMembersOnRoot; BaseUri; IgnoreUidsOnPropertyElements; LocalAssembly; ValuesMustBeString. По умолчанию средством чтения для класса XamlServices является XamlXmlReader. Если разработчик предоставил собственное средство чтения XamlXmlReader с соответствующими значениям, значения, не являющиеся значениями по умолчанию, устанавливаются для следующих свойств XamlXmlReaderSettings: CloseInput; SkipXmlCompatibilityProcessing; XmlLang; XmlSpacePreserve.
Разбор
Метод Parse подобен методу Load в том, что он является API-интерфейсом пути загрузки, создающим поток узлов XAML из входных данных XAML. Однако в этом случае входные данные XAML предоставляются напрямую в виде строки, содержащей весь загружаемый код XAML. Метод Parse представляет собой упрощенный подход, более пригодный для сценариев приложений, чем сценариев платформы. Дополнительные сведения см. в разделе Parse. Метод Parse фактически является просто инкапсулированным вызовом метода Load(XmlReader), внутри которого используется StringReader.
Сохранить
Различные перегрузки метода Save реализуют путь сохранения. Все методы Save получают в качестве входных данных граф объектов и выдают результат в виде потока, файла или экземпляра XmlWriter/TextWriter.
Ожидается, что входной объект является корневым объектом некоторого объектного представления. Это могут быть единственный корень бизнес-объекта, корень дерева объектов для страницы в сценарии пользовательского интерфейса, рабочая область редактирования средства разработки или другие понятия корневых объектов, соответствующие сценариям.
Во многих сценариях сохраняемое дерево объектов связано с первоначальной операцией, использующей для загрузки XAML либо метод Load, либо другой интерфейс API, реализованной моделью платформы/приложения. Возможны различия, вносимые в дерево объектов из-за изменений состояния, из-за изменений, вызванных захватом приложением параметров времени выполнения, введенных пользователем, из-за изменений кода XAML, обусловленных тем, что приложение является областью разработки кода XAML, и т. д. Независимо от наличия изменений, для понятия первоначальной загрузки кода XAML из разметки, его последующего повторного сохранения и сравнения двух форм разметки XAML иногда используется термин "представление XAML с циклом обработки".
Проблема сохранения и сериализации сложного объекта, заданного в виде разметки, сводится к достижению правильного баланса между полным представлением без потери данных и избыточной детализацией, ухудшающей восприятие XAML человеком. Более того, у различных пользователей XAML могут отличаться определения или ожидания для правильной настройки этого баланса. Интерфейсы API метода Save представляют собой одно определение такого баланса. API-интерфейсы Save используют доступный контекст схемы XAML, характеристики по умолчанию XamlType, XamlMember на основе среды CLR и другие встроенные функции XAML и концепции системы типов XAML, чтобы определить, где можно оптимизировать определенные конструкции потока узлов XAML при сохранении их обратно в разметку. Например, пути сохранения XamlServices могут использовать контекст схемы XAML по умолчанию на основе среды CLR, чтобы разрешать XamlType для объектов и определять XamlType.ContentProperty, а затем могут опускать теги элементов свойства при записи свойства в XAML-содержимое объекта.
Transform
Метод Transform преобразует или трансформирует XAML, связывая путь загрузки и путь сохранения в одну операцию. Для средств чтения XamlReader и записи XamlWriter можно использовать другой контекст схемы или другую систему резервных типов, которые и влияют на преобразование полученного XAML-кода. Это хорошо работает для широкого диапазона операций преобразования.
Для операций, предполагающих рассмотрение каждого узла в потоке узлов XAML, метод Transform обычно не используется. Вместо этого разработчику необходимо определить собственную серию операций пути загрузки и пути сохранения, вставляя в нее свою логику. В одном из путей используйте пару средств чтения/записи XAML вокруг своего собственного цикла узлов. Например, загрузите исходный код XAML, используя XamlXmlReader, и пошагово входите в узлы с помощью последовательных вызовов метода Read. Работая на уровне потока узлов XAML, теперь можно настроить отдельные узлы (типы, члены, другие узлы), чтобы применить преобразование, или оставить узел "как есть". Затем можно передать узел дальше в соответствующий интерфейс API Write XamlObjectWriter и записать объект. Дополнительные сведения см. в разделе Общее представление о понятиях и структурах потока узлов XAML.