Контекст схемы XAML по умолчанию и контекст схемы WPF XAML
Контекст схемы XAML — это концептуальная сущность, которая определяет, как в рабочей среде XAML, использующая определенный словарь XAML, взаимодействует с поведением записи объектов, включая способ разрешения сопоставления типов, загрузку сборок, интерпретацию определенных параметров чтения и записи. В этом разделе описываются функции служб XAML .NET и связанного контекста схемы XAML по умолчанию, основанного на системе типов CLR. В этом разделе также описывается контекст схемы XAML, используемый для WPF.
Контекст схемы XAML по умолчанию
Службы XAML .NET реализуют и используют контекст схемы XAML по умолчанию. Поведение контекста схемы XAML по умолчанию не всегда отображается в API класса XamlSchemaContext. Однако во многих случаях поведение контекста схемы XAML по умолчанию наблюдается с помощью общего API системы типов XAML, таких как члены XamlMember или XamlType, или через API, предоставляемые средствами чтения 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 имеет несколько моделей содержимого для 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, основанные на System.Windows.Markup.XamlReader WPF или System.Windows.Markup.XamlWriter, контекст схемы WPF XAML уже используется для этих реализаций чтения XAML и записи XAML.
Если вы используете другие реализации средства чтения XAML или средства записи XAML, которые не инициализируются с контекстом схемы WPF XAML, вы можете получить рабочий контекст схемы XAML WPF из XamlReader.GetWpfSchemaContext. Затем это значение можно использовать в качестве инициализации для других API, использующих XamlSchemaContext. Например, можно вызвать XamlXmlReader для инициализации и передать контекст схемы WPF XAML. Или можно использовать контекст схемы WPF XAML для системных операций типа XAML. Это может включать инициализацию конструкции XamlType или XamlMemberили вызов XamlSchemaContext.GetXamlType.
Обратите внимание, что если вы обращаетесь к определенным аспектам WPF XAML с чистой точки зрения потока узлов XAML, некоторые возможности платформы WPF еще не действовали. Например, шаблоны WPF для элементов управления еще не применяются. Таким образом, если вы обращаетесь к свойству, которое во время выполнения может быть заполнено полным визуальным деревом, вы можете увидеть только значение свойства, которое ссылается на шаблон. Контекст службы, предоставленный для расширений разметки WPF, может также не быть точным, если он указан из нерабочей ситуации, и может привести к исключениям при попытке записи графа объектов.
Загрузка XAML и сборки
Загрузка сборок для служб XAML и .NET XAML интегрируется с определяемой средой CLR концепции AppDomain. Контекст схемы XAML интерпретирует загрузку сборок или поиск типов во время выполнения или во время разработки на основе использования AppDomain и других факторов. Логика немного отличается в зависимости от того, является ли XAML свободной для средства чтения XAML, компилируется в библиотеку DLL XamlBuildTask
или BAML создается PresentationBuildTask
WPF.
Контекст схемы XAML для WPF интегрируется с моделью приложения WPF, которая, в свою очередь, использует AppDomain, а также другие факторы, которые являются сведениями о реализации WPF.
Входные данные чтения XAML (свободные xaml)
Контекст схемы XAML выполняет итерацию AppDomain приложения, ищет уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки. Если совпадение найдено, эта сборка используется для разрешения.
В противном случае для загрузки сборки используется один из следующих методов на основе API CLR Assembly:
Если имя указано в сопоставлении, вызовите Assembly.Load(String) по имени.
Если предыдущий шаг завершается ошибкой, используйте короткое имя (и маркер открытого ключа при наличии), чтобы вызвать Assembly.Load(String).
Если имя не задано в сопоставлении, вызовите Assembly.LoadWithPartialName.
XamlBuildTask
XamlBuildTask
используется для Windows Communication Foundation (WCF) и Windows Workflow Foundation.
Обратите внимание, что ссылки на сборки с помощью XamlBuildTask
всегда являются полными.
Вызов Assembly.Load(String) по имени.
Если предыдущий шаг завершается ошибкой, используйте короткое имя (и маркер открытого ключа при наличии), чтобы вызвать Assembly.Load(String).
BAML (PresentationBuildTask)
Существует два аспекта загрузки сборки для BAML: загрузка начальной сборки, содержащей BAML в качестве компонента, и загрузка сборок резервного типа для любых типов, на которые ссылается рабочая среда BAML.
Загрузка сборки для начальной разметки:
Ссылка на сборку для загрузки разметки всегда не является равной.
Контекст схемы WPF XAML выполняет итерацию AppDomain приложения WPF, которая ищет уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки. Если совпадение найдено, эта сборка используется для разрешения.
Если предыдущий шаг завершается ошибкой, используйте короткое имя (и маркер открытого ключа при наличии), чтобы вызвать Assembly.Load(String).
Ссылки на сборки по типам BAML:
Ссылки на сборки для типов, используемых в рабочей среде BAML, всегда полны в качестве выходных данных задачи сборки.
Контекст схемы WPF XAML выполняет итерацию AppDomain приложения WPF, которая ищет уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки. Если совпадение найдено, эта сборка используется для разрешения.
В противном случае для загрузки сборки используется один из следующих методов:
Вызов Assembly.Load(String) по имени.
Если короткое имя и сочетание маркеров открытого ключа соответствует сборке, из которую был загружен BAML, используйте ее.
Используйте короткое имя и маркер открытого ключа для вызова Assembly.Load(String).
См. также
.NET Desktop feedback