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


Контекст схемы языка XAML по умолчанию и контекст схемы языка XAML WPF

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

Контекст схемы XAML по умолчанию

Службы XAML .NET реализуют и используют контекст схемы XAML по умолчанию. Поведение контекста схемы XAML по умолчанию не всегда отображается в API XamlSchemaContext класса. Однако во многих случаях поведение контекста схемы XAML по умолчанию наблюдается через общий API системы типов XAML, например членов XamlMember или XamlTypeAPI, предоставляемых средствами чтения XAML и средствами записи XAML, которые используют контекст схемы XAML по умолчанию.

Вы можете создать XamlSchemaContext инкапсулирующее поведение по умолчанию, вызвав XamlSchemaContext конструктор. Это явно создает контекст схемы XAML по умолчанию. Тот же контекст схемы XAML по умолчанию создается неявно, если инициализировать средство чтения XAML или записи XAML с помощью API, которые явно не принимают входной XamlSchemaContext параметр.

Контекст схемы XAML по умолчанию использует отражение среды CLR для поведения сопоставления типов. Это включает в себя изучение определения среды CLR Typeи связанных PropertyInfo или MethodInfo. Кроме того, для заполнения конкретных сведений о типе XAML или члене XAML, использующего тип clR, используется атрибут CLR. Контекст схемы XAML по умолчанию не требует методов расширения системы типов, таких как шаблон, так как Invoker необходимые сведения доступны в системе типов CLR.

Для логики загрузки сборок контекст схемы XAML по умолчанию зависит главным образом от значений сборок, предоставляемых в сопоставлениях пространства имен XAML. Кроме того, LocalAssembly можно указать на загрузку сборки для таких сценариев, как загрузка внутренних типов.

Контекст схемы XAML WPF

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

Переопределения подстановки: WPF имеет несколько con режим палатки ls для XAML, в которых есть свойства содержимого XAML, которые не ContentPropertyAttribute имеют атрибутов. LookupContentProperty Переопределения для WPF реализуют это поведение.

Отсрочка для выражений WPF: WPF включает несколько классов выражений, которые откладывают значение до тех пор, пока контекст среды выполнения не будет доступен. Кроме того, расширение шаблона — это поведение среды выполнения, использующее методы отсрочки.

Оптимизация поиска типов: WPF имеет обширный словарь XAML и объектную модель, включая определения членов базового класса, наследующие буквально сотни определенных классов WPF. Кроме того, WPF распространяется по нескольким сборкам. WPF оптимизирует поиск типов с помощью таблиц подстановки и других методов. Это обеспечивает улучшения производительности по сравнению с контекстом схемы XAML по умолчанию и поиском типа на основе СРЕДЫ CLR. В случаях, когда типы не существуют в таблице подстановки, поведение использует методы контекста схемы XAML, аналогичные контексту схемы XAML по умолчанию.

Расширение XamlType и XamlMember: WPF расширяет понятия свойств с свойствами зависимостей и понятиями событий с маршрутизированными событиями. Чтобы обеспечить более высокую видимость этих понятий для операций обработки XAML, WPF расширяет XamlType и XamlMemberдобавляет внутренние свойства, которые сообщают о свойстве зависимостей и перенаправленных характеристиках событий.

Доступ к контексту схемы XAML WPF

Если вы используете методы XAML, основанные на WPF илиSystem.Windows.Markup.XamlWriter, контекст схемы WPF System.Windows.Markup.XamlReader XAML уже используется для этих реализаций чтения XAML и записи XAML.

Если вы используете другие реализации средства чтения XAML или средства записи XAML, которые не инициализируются с контекстом схемы WPF XAML, вы можете получить рабочий контекст схемы XAML WPF.XamlReader.GetWpfSchemaContext Затем это значение можно использовать в качестве инициализации для других API, использующих a XamlSchemaContext. Например, можно вызвать XamlXmlReader инициализацию и передать контекст схемы WPF XAML. Или можно использовать контекст схемы WPF XAML для системных операций типа XAML. Это может включать инициализацию конструкции или XamlTypeXamlMemberвызова XamlSchemaContext.GetXamlType.

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

Загрузка XAML и сборки

Загрузка сборок для служб XAML и .NET XAML интегрируется с определяемой средой CLR.AppDomain Контекст схемы XAML интерпретирует загрузку сборок или поиск типов во время выполнения или во время разработки на основе использования AppDomain и других факторов. Логика немного отличается в зависимости от того, является ли XAML свободной для средства чтения XAML, скомпилирован в библиотеку DLL XamlBuildTaskили BAML создается WPF PresentationBuildTask.

Контекст схемы XAML для WPF интегрируется с моделью приложения WPF, которая, в свою очередь, использует AppDomain и другие факторы, которые являются сведениями о реализации WPF.

Входные данные чтения XAML (свободные xaml)

  1. Контекст схемы XAML выполняет итерацию через AppDomain приложение, ищу уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки. Если совпадение найдено, эта сборка используется для разрешения.

  2. В противном случае для загрузки сборки используется один из следующих методов, основанных на API СРЕДЫ CLR Assembly :

    • Если имя квалифицировано в сопоставлении, вызовите Assembly.Load(String) полное имя.

    • Если предыдущий шаг завершается ошибкой, используйте короткое имя (и маркер открытого ключа при наличии) для вызова Assembly.Load(String).

    • Если имя не задано в сопоставлении, вызовите Assembly.LoadWithPartialName.

XamlBuildTask

XamlBuildTask используется для Windows Communication Foundation (WCF) и Windows Workflow Foundation.

Обратите внимание, что ссылки на сборки XamlBuildTask всегда полны.

  1. Вызов Assembly.Load(String) имени.

  2. Если предыдущий шаг завершается ошибкой, используйте короткое имя (и маркер открытого ключа при наличии) для вызова Assembly.Load(String).

BAML (PresentationBuildTask)

Существует два аспекта загрузки сборки для BAML: загрузка начальной сборки, содержащей BAML в качестве компонента, и загрузка сборок резервного типа для любых типов, на которые ссылается рабочая среда BAML.

Загрузка сборки для начальной разметки:

Ссылка на сборку для загрузки разметки всегда не является равной.

  1. Контекст схемы WPF XAML выполняет итерацию через AppDomain приложение WPF, ищу уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки. Если совпадение найдено, эта сборка используется для разрешения.

  2. Если предыдущий шаг завершается ошибкой, используйте короткое имя (и маркер открытого ключа при наличии) для вызова Assembly.Load(String).

Ссылки на сборки по типам BAML:

Ссылки на сборки для типов, используемых в рабочей среде BAML, всегда полны в качестве выходных данных задачи сборки.

  1. Контекст схемы WPF XAML выполняет итерацию через AppDomain приложение WPF, ищу уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки. Если совпадение найдено, эта сборка используется для разрешения.

  2. В противном случае для загрузки сборки используется один из следующих методов:

    • Вызов Assembly.Load(String) имени.

    • Если короткое имя и сочетание маркеров открытого ключа соответствует сборке, из которую был загружен BAML, используйте ее.

    • Используйте короткое имя и маркер открытого ключа для вызова Assembly.Load(String).

См. также