Служебные контексты, доступные для расширений разметки и преобразователей типов
Авторам типов, поддерживающих употребление преобразователей типов и расширений разметки, часто необходимо располагать сведениями о существующем контексте их употребления в разметке или в окружающей структуре графа объектов. Эти сведения могут понадобиться для правильного создания экземпляров предоставляемого объекта, или чтобы можно было создать ссылки этого объекта на существующие объекты в графе объектов. При использовании служб XAML платформы .NET Framework контекст, который может потребоваться, предоставляется в виде набора интерфейсов служб. Код поддержки преобразователя типов или расширения разметки может запрашивать службу, используя контекст поставщика службы, доступный и переданный из средства записи XamlObjectWriter или связанных типов. Контекст схемы XAML напрямую доступен с помощью одной из подобных служб. В данном разделе описан способ получения доступа к контекстам служб из реализации преобразователя значений и приводится перечень стандартных доступных служб и их роли.
В этом разделе содержатся следующие подразделы.
- Получение служб
- Службы для расширения разметки
- Службы для преобразователя типов
- Службы для сериализатора значений
- Использование контекстов поставщиков служб XAML
- Доступные службы из контекста служб XAML платформы .NET Framework
- Связанные разделы
Получение служб
Разработчику, реализующему преобразователь значений, часто нужен доступ к некоторому типу контекста, в котором используется преобразователь значений. Этот контекст может содержать сведения, такие как активный контекст схемы 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 Framework для пути загрузки или пути сохранения вызывает соответствующие методы расширения разметки или преобразователя типов, которым требуется контекст службы. В зависимости от ситуации контекст служб системы предоставляет либо MarkupExtensionContext, либо TextSyntaxContext, но особенности обоих этих классов остаются скрытыми. Взаимодействие разработчика с этими классами ограничено запросом служб от них с помощью метода GetService.
Доступные службы из контекста служб XAML платформы .NET Framework
Службы XAML платформы .NET Framework определяют службы для расширений разметки, преобразователей типов, сериализаторов значений и других возможных вариантов использования. В следующих подразделах описывается каждая из этих служб и приводятся рекомендации по возможному ее использованию в реализациях.
IServiceProvider
Справочная документация: IServiceProvider.
Относится к: базовой работе основанной на службах инфраструктуры в платформе .NET Framework; обеспечивает возможность вызова метода IServiceProvider.GetService.
ITypeDescriptorContext
Справочная документация: ITypeDescriptorContext.
Является производным от IServiceProvider. Этот класс представляет контекст в стандартных сигнатурах TypeConverter; TypeConverter — класс, существующий начиная с .NET Framework 1.0, т. е. он существовал еще до появления XAML и сценария с использованием TypeConverter в XAML для преобразования типов строковых значений. В контексте служб XAML платформы .NET Framework методы класса TypeConverter реализованы явно. Поведение явной реализации показывает вызывающей стороне, что API ITypeDescriptorContext не соответствует системе типов XAML либо чтению или записи объектов из XAML. Container, Instance и PropertyDescriptor обычно возвращают null из контекстов служб XAML платформы .NET Framework.
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 или наоборот. Этот сценарий в основном относится к службам приложений, предоставляемым конкретной платформой, или возможностям часто используемого класса корневого элемента в платформе. Базовый универсальный код ресурса (URI) может быть установлен как параметр средства чтения XAML, который затем передается средству записи объектов XAML, и эта служба сообщает о нем.
IAmbientProvider
Справочная документация: IAmbientProvider.
Определена в: пространстве имен System.Xaml, сборке System.Xaml.
Относится к: обработке путей загрузки и задержке или оптимизации поиска типов.
API-интерфейсы службы: GetAllAmbientValues, 3 других.
Понятие окружения в XAML — это способ пометки конкретного члена типа как внешнего. Другой вариант — тип может быть внешним, чтобы все значения свойств, в которых хранится экземпляр типа, считались внешними свойствами. Расширения разметки или преобразователи типов, находящиеся ниже в потоке узлов XAML и являющиеся потомками в графе объектов, могут получать доступ к внешнему свойству или экземпляру типа во время загрузки или использовать знание внешней структуры во время сохранения. Это может влиять на степень определенности, необходимую для разрешения типов для других служб, таких как IXamlTypeResolver или x:Type. См. также раздел AmbientPropertyValue.
IXamlSchemaContextProvider
Справочная документация: IXamlSchemaContextProvider.
Определена в: пространстве имен System.Xaml, сборке System.Xaml.
Относится к: пути загрузки и любой операции, которая должна разрешать тип XAML в резервный тип.
API-интерфейс службы: SchemaContext.
Контекст схемы XAML необходим для всех отложенных операций загрузки, так как этот же контекст схемы должен действовать в отложенной области, чтобы интегрировать отложенное содержимое. Дополнительные сведения о роли контекста схемы XAML см. в разделе Службы XAML.
IRootObjectProvider
Справочная документация: IRootObjectProvider.
Определена в: пространстве имен System.Xaml, сборке System.Xaml.
Относится к: пути загрузки.
API-интерфейс службы: RootObject.
Этот служба в основном относится к службам приложений, предоставляемым отдельной платформой, или возможностям часто используемого класса корневого элемента в платформе. Одним из сценариев получения корневого объекта являются подключение с фоновым кодом и привязка событий. Например, реализация x:Class в WPF используется для компиляции разметки и привязки всех атрибутов обработчиков событий, найденных в любом другом месте разметки XAML. Точка подключения разметки и определенных в выделенном коде разделяемых классов для компиляции разметки находится в корневом элементе.
IXamlNamespaceResolver
Справочная документация: IXamlNamespaceResolver.
Определена в: пространстве имен System.Xaml, сборке System.Xaml.
Относится к: пути загрузки, пути сохранения.
API-интерфейс службы: GetNamespace для пути загрузки, GetNamespacePrefixes для пути сохранения.
IXamlNamespaceResolver — это служба, которая может вернуть идентификатор пространства имен XAML / URI, используя его префикс в соответствии с исходной разметкой 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 Framework зависит от этой службы. Конкретные платформы или средства, поддерживающие платформу, используют эту службу для обработки x:Name или обработки эквивалентного (с атрибутом RuntimeNamePropertyAttribute) свойства.
IDestinationTypeProvider
Справочная документация: IDestinationTypeProvider.
Определена в: пространстве имен System.Xaml, сборке System.Xaml.
Относится к: разрешению пути загрузки для косвенных сведений о типе CLR.
API-интерфейс службы: GetDestinationType
Дополнительные сведения см. в разделе IDestinationTypeProvider.