Службы XAML

В этом разделе описываются возможности набора технологий, известного как службы XAML для .NET. Большинство рассматриваемых здесь служб и API размещается в сборке System.Xaml. Службы включают модули чтения и записи, классы схемы и поддержку схем, фабрики, атрибуты классов, встроенную поддержку языка XAML, а также другие возможности языка XAML.

Сведения об этой документации

Для изучения концептуальной документации по службам XAML для .NET требуется опыт работы с языком XAML и знание принципов его применения на различных платформах, таких как Windows Presentation Foundation (WPF) или Windows Workflow Foundation, а также в отдельных функциональных областях, например при работе с компонентами пользовательской настройки сборки Microsoft.Build.Framework.XamlTypes. В этой документации не затрагиваются основы применения XAML как языка разметки, термины синтаксиса XAML и другие сведения начального уровня. Вместо этого в ней делается акцент на применении служб XAML для .NET, включенных в библиотеку сборки System.Xaml. Большинство этих API предназначено для сценариев, связанных с интеграцией и расширяемостью языка XAML. К ним можно отнести следующие:

  • Расширение возможностей базовых модулей чтения и записи XAML (непосредственная обработка потока узлов XAML; получение собственных модулей чтения или записи XAML).

  • Определение настраиваемых типов для работы с XAML, которые не зависят от конкретной платформы, а также настройка атрибутов таких типов для передачи характеристик их системы типов XAML в службы XAML для .NET.

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

  • Написание преобразователей значений XAML (расширения разметки; преобразователи для пользовательских типов).

  • Определение пользовательского контекста схемы XAML (с использованием альтернативных методов загрузки сборки для резервных источников типов; с использованием методов поиска известных типов вместо постоянного отражения сборок; использование концепций загруженных сборок, не использующих общеязыковую среду выполнения (CLR) AppDomain, и связанной с ними модели безопасности).

  • Расширение базовой системы типов XAML.

  • Применение методик Lookup или Invoker для воздействия на систему типов и принципы оценки резервных типов.

Сведения начального уровня о языке XAML можно найти в статье Общие сведения о языке XAML (WPF .NET). В ней язык XAML рассматривается с точки зрения пользователей, не знакомых с платформой Windows Presentation Foundation (WPF) или использованием разметки и возможностей этого языка. Также для начала работы рекомендуется ознакомиться с материалами, представленными в спецификации языка XAML.

Службы XAML для .NET и System.Xaml в архитектуре .NET

В службах XAML для .NET и сборке System.Xaml определяется большая часть компонентов, необходимых для поддержки возможностей языка XAML. К ним относятся базовые классы для модулей чтения и записи XAML. Ключевой возможностью, которая была добавлена в службах XAML для .NET и отсутствовала в реализациях XAML для конкретных платформ, является представление системы типов для XAML. В этом представлении системы типов язык XAML рассматривается с использованием объектно-ориентированного подхода, который фокусируется на возможностях XAML и не учитывает зависимости от реализованных на конкретных платформах возможностей.

Система типов XAML не ограничивается формой разметки или характеристиками времени выполнения, свойственными XAML, а также какой-либо конкретной резервной системы типов. Система типов XAML включает объектные представления типов, членов, контекстов схемы XAML, концепций уровня XML и других концепций языка XAML, а также встроенных возможностей XAML. Применение или расширение системы типов XAML позволяет создавать производные классы от таких классов, как модули чтения и записи XAML, а также расширять функциональные возможности представления XAML для поддержки конкретных функций, реализуемых в рамках платформы, технологии или приложения, которые используют или генерируют XAML. Концепция контекста схемы XAML позволяет реализовать эффективные операции записи графа объектов на основе сочетания реализации модуля записи объектов XAML, резервной системы типов для соответствующей технологии, которая указывается в сведениях о сборке в контексте, а также источника узлов XAML. Дополнительные сведения о концепции схемы XAML см. в разделе Контекст схемы языка XAML по умолчанию и контекст схемы языка XAML WPF.

Потоки узлов XAML, модули чтения XAML и модули записи XAML

Чтобы понять роль, которую службы XAML для .NET играют в отношениях между языком XAML и конкретными использующими его технологиями, важно ознакомиться с концепцией потока узлов XAML, а также ее влиянием на определение API и терминологии. Поток узлов XAML представляет собой концептуальный промежуточный уровень между представлением языка XAML и графом объектов, который представляет или определяет XAML.

  • Модуль чтения XAML — это сущность, которая реализует определенную форму обработки XAML и генерирует поток узлов XAML. В API модуль чтения XAML представлен базовым классом XamlReader.

  • Модуль записи XAML — это сущность, которая обрабатывает поток узлов XAML и генерирует какие-либо другие сущности. В API модуль записи XAML представлен базовым классом XamlWriter.

    Наиболее распространенными сценариями использования XAML являются загрузка XAML для создания экземпляра графа объектов из приложения или средства, а также создание представления XAML (как правило, в форме разметки, сохраненной в текстовом файле). Сценарий загрузки XAML и создания графа объектов в этой документации зачастую называется путем загрузки. Сценарий сохранения или сериализации существующего графа объектов в XAML в этой документации часто называется путем сохранения.

    Самый распространенный тип пути загрузки можно описать следующим образом:

  • Начальное представление XAML в формате XML с кодировкой UTF сохраняется в текстовый файл.

  • Полученный файл XAML загружается в XamlXmlReader. XamlXmlReader — это подкласс XamlReader.

  • В результате получается поток узлов XAML. Отдельные узлы потока узлов XAML можно назначать с помощью API XamlXmlReader / XamlReader. Чаще всего в этом случае осуществляется продвижение по потоку узлов XAML с последовательной обработкой каждого узла как "текущей записи".

  • Полученные узлы передаются из потока узлов XAML в API XamlObjectWriter. XamlObjectWriter — это подкласс XamlWriter.

  • XamlObjectWriter осуществляет запись графа объектов по одному объекту за раз в соответствии с ходом обработки исходного потока узлов XAML. Запись объекта осуществляется с использованием контекста схемы XAML и реализации, которая имеет доступ ко всем сборкам и типам резервной системы типов и платформы.

  • В конце потока узлов XAML вызывается Result для получения корневого объекта графа объектов.

    Самый распространенный тип пути сохранения можно описать следующим образом:

  • Для начала принимается граф объектов времени выполнения для всего приложения, содержимое и состояние пользовательского интерфейса во время выполнения, либо частичный сегмент общего представления объекта приложения во время выполнения.

  • Объекты загружаются из логического начального объекта, например корневого объекта приложения или документа, в XamlObjectReader. XamlObjectReader — это подкласс XamlReader.

  • В результате получается поток узлов XAML. Отдельные узлы потока узлов XAML можно назначать с помощью API XamlObjectReader и XamlReader. Чаще всего в этом случае осуществляется продвижение по потоку узлов XAML с последовательной обработкой каждого узла как "текущей записи".

  • Полученные узлы передаются из потока узлов XAML в API XamlXmlWriter. XamlXmlWriter — это подкласс XamlWriter.

  • XamlXmlWriter записывает XAML в формате XML в кодировке UTF. Полученные данные можно сохранить в виде текстового файла, потока или в другой форме.

  • Для получения конечных выходных данных вызывается Flush.

Дополнительные сведения о концепциях потока узлов XAML см. в статье Общее представление о понятиях и структурах потока узлов XAML.

Класс XamlServices

Поток узлов XAML требуется не во всех случаях. Если вам требуется базовый путь загрузки или сохранения, вы можете использовать API, реализованные в классе XamlServices.

  • Путь загрузки реализуется с использованием различных сигнатур Load. Можно загрузить файл или поток, либо загрузить XmlReader, TextReaderили XamlReader для заключения входных данных XAML в оболочку путем загрузки с интерфейсами API модуля чтения.

  • Методы Save с разными сигнатурами принимают граф объектов на вход, а выходом является поток, файл или экземпляр XmlWriter/TextWriter.

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

Дополнительные сведения об использовании XamlServices см. в статье Класс XAMLServices и чтение или запись базового кода XAML.

Система типов XAML

Система типов XAML предоставляет API-интерфейсы, необходимые для работы с отдельными узлами потока узлов XAML.

XamlType — это представление объекта, который обрабатывается между начальным и конечным узлом объекта.

XamlMember — это представление члена объекта, который обрабатывается между начальным и конечным членом узла.

API-интерфейсы, например GetAllMembers, GetMember и DeclaringType, сообщают о связи между XamlType и XamlMember.

По умолчанию (например, в службах XAML для .NET) система типов XAML реализуется на основе общеязыковой среды выполнения (CLR) и статического анализа типов CLR в сборках посредством отражения. Соответственно, для конкретного типа CLR в определяемой по умолчанию реализации система типов XAML может предоставлять схему XAML этого типа и его членов, а также сообщать о связи между ними в контексте системы типов XAML. В системе типов XAML по умолчанию концепция возможности назначения типов сопоставляется с принципами наследования CLR, а понятия экземпляров, типов значений и т. д. — с соответствующими понятиями и функциями CLR.

Справочник по возможностям языка XAML

Чтобы обеспечить поддержку XAML, в службах XAML для .NET используется специальная реализация концепций языка XAML, определяемая в пространстве имен XAML языка XAML. Эти концепции задокументированы на соответствующих страницах справочника. В документации возможности языка рассматриваются с точки зрения их поведения при обработке модулем чтения или записи XAML, который определяется в службах XAML для .NET. Для получения дополнительной информации см. XAML Namespace (x:) Language Features.