Поделиться через


Класс XAMLServices и базовый код XAML для чтения или записи

XamlServices — это класс, предоставляемый .NET, который можно использовать для решения сценариев XAML, для которых не требуется конкретный доступ к потоку узлов XAML или системным данным типа XAML, полученным из этих узлов. XamlServices API можно свести в сводку следующим образом: Load или Parse поддерживать путь загрузки XAML, Save поддерживать путь сохранения XAML, а Transform также предоставлять метод, который присоединяет путь загрузки и сохраняет путь. Можно использоватьTransform для изменения одной схемы XAML на другую. В этом разделе собраны все классификации этих API и приведены различия между определенными перегрузками методов.

Загрузить

Различные перегрузки метода 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. Чтобы использовать эти перегрузки, необходимо уже создать экземпляр средства чтения и использовать его Create API для загрузки XAML в соответствующей форме (текст или XML). Это не имеет значения, если вы уже переместили указатели записей в других средствах чтения или выполняли другие операции с ними. Логика пути загрузки из Load всегда обрабатывает все входные данные XAML, начиная с корневого элемента. В следующих сценариях может потребоваться использовать эти перегрузки:

  • Рабочие области, где реализуются простые возможности редактирования XAML с помощью существующего текстового редактора, поддерживающего XML.

  • Варианты основных сценариев System.IO , где для открытия файлов или потоков используются выделенные средства чтения. Логика выполняет простую проверку или обработку содержимого перед повторной попыткой загрузки в формате XAML.

Вы можете загрузить файл или поток или загрузить или XmlReaderTextReaderXamlReader загрузить входные данные 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и других встроенных функций XAML и других понятий системных типов XAML по умолчанию на базе CLR, чтобы определить, можно ли оптимизировать определенные конструкции потока узлов XAML при их сохранении в разметку. Например, пути сохранения XamlServices могут использовать контекст схемы XAML по умолчанию на основе CLR для преобразования XamlType для объектов, могут определять XamlType.ContentProperty, а затем могут опускать теги элементов свойства при записи свойства в содержимое XAML объекта.

Преобразование

Transform преобразует XAML, связывая путь загрузки и путь сохранения в одну операцию. Для XamlReader и XamlWriterможет использоваться другой контекст схемы или другая система резервных типов, что повлияет на преобразование полученного XAML-кода. Это хорошо подходит для операций широкого преобразования.

Transformобычно не используется для операций, зависящих от проверки каждого узла в потоке узлов XAML, Вместо этого необходимо определить собственную серию операций с путями загрузки и сохранения и использовать собственную логику. В одном из путей используйте пару из средства чтения и средства записи XAML в собственном цикле узлов. Например, можно загрузить исходный XAML с помощью XamlXmlReader , а затем переходить в узлы при помощи последовательных вызовов Read . Работая на уровне потока узлов XAML, можно настраивать отдельные узлы (типы, члены, другие узлы) для применения преобразований или оставить узлы как есть. Затем можно передать узел дальше в соответствующий API WriteXamlObjectWriter и записать объект. Для получения дополнительной информации см. Understanding XAML Node Stream Structures and Concepts.

См. также