Служебные контексты, доступные для расширений разметки и преобразователей типов

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

Получение служб

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

Службы для расширения разметки

MarkupExtension содержит только один виртуальный метод ProvideValue. Входной параметр serviceProvider определяет, как службы взаимодействуют с реализациями, когда расширение разметки вызывается обработчиком XAML. В следующем псевдокоде показано, как реализация расширения разметки может запросить службы в ProvideValue:

public override object ProvideValue(IServiceProvider serviceProvider)
{
    //...
    // Get the IXamlTypeResolver from the service provider
    if (serviceProvider == null)
    {
        throw new ArgumentNullException("serviceProvider");
    }
    IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
    if (xamlTypeResolver == null)
    {
        throw new ArgumentException("IXamlTypeResolver");
    }
    //...
}

Службы для преобразователя типов

TypeConverter содержит четыре виртуальных метода, использующих контекст службы и поддерживающих использование XAML. Каждый из этих методов передает входной параметр context . Этот параметр имеет тип ITypeDescriptorContext, но интерфейс наследует IServiceProvider, поэтому вам доступен метод GetService для реализации преобразователя типов.

В следующем псевдокоде показано, как реализация преобразователя типов для использований XAML может запросить службы в одном из переопределенных методов, в данном случае это ConvertFrom:

public override object ConvertFrom(ITypeDescriptorContext typeDescriptorContext,
  CultureInfo cultureInfo,
  object source)
{
    IRootObjectProvider rootProvider = typeDescriptorContext.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
    if (rootProvider != null && source is String)
    {
        //return something, else ...
    }
    throw GetConvertFromException(source);
}

Службы для сериализатора значений

Для контекста сериализатора значений используется тип поставщика службы, который относится к классу ValueSerializer , IValueSerializerContext. Этот контекст передается переопределениям четырех виртуальных методов ValueSerializer . Вызовите GetService из контекста для получения служб.

Использование контекстов поставщиков служб XAML

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

Доступные службы из контекста службы XAML .NET

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

IServiceProvider

Справочная документация: IServiceProvider

Область применения: основные операции основанной на службах инфраструктуры в .NET, позволяющие вызывать IServiceProvider.GetService.

ITypeDescriptorContext

Справочная документация: ITypeDescriptorContext

Происходит от IServiceProvider. Этот класс представляет контекст в стандартных сигнатурах TypeConverter . TypeConverter — это класс, существовавший начиная с .NET Framework 1.0. Эта реализация предшествовала XAML и сценариям XAML TypeConverter для преобразования строковых типов. В контексте служб XAML .NET методы TypeConverter реализованы явно. Явная реализация указывает вызывающим объектам, что ITypeDescriptorContext API не связан с системами типов XAML, а также чтением или записью объектов в XAML. Container, Instance, и PropertyDescriptor обычно возвращают null из контекстов служб XAML .NET.

IValueSerializerContext

Справочная документация: IValueSerializerContext

Это производный от ITypeDescriptorContext класс, который также использует явные реализации для подавления ложных выводов о системе типов XAML. Поддерживает статические вспомогательные методы поиска в ValueSerializer.

IXamlTypeResolver

Справочная документация: IXamlTypeResolver

Определяется:System.Windows.Markup пространство имен, сборка System.Xaml

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

API службы:Resolve

Может влиять на сопоставление типов XAML в CLR, необходимое, когда средство записи XAML создает объект среды CLR в графе объектов. Resolve обрабатывает потенциально содержащую префикс строку, которая соответствует имени типа XAML (XamlType.Name) и возвращает Typeсреды CLR. Разрешение типов обычно сильно зависит от контекста схемы XAML. Только контекст схемы языка XAML учитывает, какие сборки загружаются и какие из них можно или нужно использовать для разрешения типов.

IUriContext

Справочная документация: IUriContext

Определяется:System.Windows.Markup пространство имен, сборка System.Xaml

Область применения: обработка пути загрузки и сохранения значений элементов, которые представляют собой URI или значения x:Uri .

API службы:BaseUri

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

IAmbientProvider

Справочная документация: IAmbientProvider

Определяется:System.Xaml пространство имен, сборка System.Xaml

Область применения: обработки пути загрузки и задержка или оптимизация поиска типов.

API службы:GetAllAmbientValues, три других.

Понятие окружения в XAML — это метод пометки конкретного члена типа как внешнего. Или же тип может быть внешним, чтобы все значения свойств, хранящих экземпляр типа, считались внешними свойствами. Расширения разметки или преобразователи типов, находящиеся ниже вдоль потока узлов XAML и являющиеся потомками в графе объектов, могут получить доступ к внешнему свойству или экземпляру типа во время загрузки. Также они могут использовать знание внешней структуры, чтобы сэкономить время. Это может повлиять на степень определенности, необходимую для разрешения типов для других служб, таких как IXamlTypeResolver или x:Type. См. также AmbientPropertyValue.

IXamlSchemaContextProvider

Справочная документация: IXamlSchemaContextProvider

Определяется:System.Xaml пространство имен, сборка System.Xaml

Область применения: путь загрузки и любые операции, которым необходимо разрешить тип XAML в базовый тип.

API службы:SchemaContext

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

IRootObjectProvider

Справочная документация: IRootObjectProvider

Определяется:System.Xaml пространство имен, сборка System.Xaml

Область применения: путь загрузки.

API службы:RootObject

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

IXamlNamespaceResolver

Справочная документация: IXamlNamespaceResolver

Определяется:System.Xaml пространство имен, сборка System.Xaml

Область применения: путь загрузки, путь сохранения.

API службы:GetNamespace для пути загрузки, GetNamespacePrefixes для пути сохранения.

IXamlNamespaceResolver — это служба, которая может вернуть идентификатор или URI пространства имен XAML, используя его префикс, сопоставленный в исходной разметке XAML.

IProvideValueTarget

Справочная документация: IProvideValueTarget

Определяется:System.Windows.Markup пространство имен, сборка System.Xaml

Область применения: путь загрузки, путь сохранения.

API службы:TargetObject, TargetProperty.

IProvideValueTarget позволяет преобразователям типов и расширениям разметки получать контекст расположения во время загрузки. Реализации могут применять этот контекст, чтобы сделать использование недействительным. Например, WPF располагает логикой внутри некоторых расширений разметки, таких как DynamicResourceExtension. Эта логика проверяет TargetProperty , чтобы убедиться в том, что расширение используется только для задания свойств зависимостей (или краткого списка других свойств, не относящихся к зависимостям).

IXamlNameResolver

Справочная документация: IXamlNameResolver

Определяется:System.Xaml пространство имен, сборка System.Xaml

Область применения: определение графа пути загрузки, разрешение объектов, обозначенных x:Name, x:Referenceили методы, связанные с определенной платформой.

API службы:Resolve; другие интерфейсы API для более сложных сценариев, таких как работа с прямыми ссылками.

Реализация обработки x:Reference в службах XAML .NET зависит от этой службы. Определенные платформы или средства, поддерживающие платформу, используют эту службу для обработки x:Name или эквивалентной обработки свойств (с атрибутамиRuntimeNamePropertyAttribute ).

IDestinationTypeProvider

Справочная документация: IDestinationTypeProvider

Определяется:System.Xaml пространство имен, сборка System.Xaml

Область применения: разрешение пути загрузки дополнительных сведений о типе CLR.

API службы:GetDestinationType

Дополнительные сведения см. в разделе IDestinationTypeProvider.

См. также