Служебные контексты, доступные для расширений разметки и преобразователей типов
Авторам типов, поддерживающих использование преобразователей типов и расширений разметки, часто необходимы контекстные сведения о расположении использования в разметке или в окружающей структуре графа объектов. Сведения могут понадобиться, чтобы правильно создать экземпляр предоставленного объекта или чтобы объект ссылался на существующие объекты в графе объектов. При использовании служб 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.
См. также
.NET Desktop feedback