Служебные контексты, доступные для расширений разметки и преобразователей типовService Contexts Available to Type Converters and Markup Extensions

Авторам типов, поддерживающих использование преобразователей типов и расширений разметки, часто необходимы контекстные сведения о расположении использования в разметке или в окружающей структуре графа объектов.Authors of the types that support type converter and markup extension usages must often have contextual information about where a usage is located in the markup, or in surrounding object graph structure. Сведения могут понадобиться, чтобы правильно создать экземпляр предоставленного объекта или чтобы объект ссылался на существующие объекты в графе объектов.Information might be needed so that the provided object is instantiated correctly or so that object references to existing objects in the object graph can be made. При использовании служб XAML .NET контекст, который может потребоваться, предоставляется в виде ряда интерфейсов служб.When using .NET XAML Services, the context that might be required is exposed as a series of service interfaces. Код поддержки преобразователей типов или разметки расширения может запросить службу, используя контекст поставщика службы, доступный и переданный из XamlObjectWriter или связанных типов.Type converter or markup extension support code can query for a service by using a service provider context that is available and passed through from XamlObjectWriter or related types. Контекст схемы XAML доступен напрямую через одну такую службу.The XAML schema context is directly available through one such service. В этом разделе описывается порядок доступа к контексту службы из реализации преобразователя значений и указывается список доступных служб и их роли.This topic describes how to access service contexts from a value converter implementation, and lists typically available services and their roles.

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

При реализации преобразователя значений часто требуется доступ к определенному контексту, в котором он применяется.As an implementer of a value converter, you often need access to some type of context in which the value converter is applied. Этот контекст может включать такие сведения, как активный контекст схемы XAML, доступ к системе сопоставления типов, предоставляемой контекстом схемы XAML и средством записи объектов XAML, и т. д.This context might include information such as the active XAML schema context, access to the type-mapping system that the XAML schema context and XAML object writer provide, and so on. Службы, доступные для реализации расширения разметки или преобразователя типов, взаимодействуют с помощью параметров контекста, являющихся частью сигнатуры каждого виртуального метода.The services available for a markup extension or type converter implementation are communicated through the context parameters that are part of the signature of each virtual method. В каждом случае в контексте реализован класс IServiceProvider , который может вызывать IServiceProvider.GetService для запроса службы.In every case, you have IServiceProvider implemented in the context, and can call IServiceProvider.GetService to request a service.

Службы для расширения разметкиServices for a Markup Extension

MarkupExtension содержит только один виртуальный метод ProvideValue.MarkupExtension has only one virtual method, ProvideValue. Входной параметр serviceProvider определяет, как службы взаимодействуют с реализациями, когда расширение разметки вызывается обработчиком XAML.The input serviceProvider parameter is how the services are communicated to implementations when the markup extension is called by a XAML processor. В следующем псевдокоде показано, как реализация расширения разметки может запросить службы в ProvideValue:The following pseudocode illustrates how a markup extension implementation might query for services in its 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"));
    }
...
}

Службы для преобразователя типовServices for a Type Converter

TypeConverter содержит четыре виртуальных метода, использующих контекст службы и поддерживающих использование XAML.TypeConverter has four virtual methods that use a service context and that support XAML usages. Каждый из этих методов передает входной параметр context .Each of these methods passes an input context parameter. Этот параметр имеет тип ITypeDescriptorContext, но интерфейс наследует IServiceProvider, поэтому вам доступен метод GetService для реализации преобразователя типов.This parameter is of type ITypeDescriptorContext, but that interface inherits IServiceProvider, and therefore, there is a GetService method available to type converter implementations.

В следующем псевдокоде показано, как реализация преобразователя типов для использований XAML может запросить службы в одном из переопределенных методов, в данном случае это ConvertFrom:The following pseudocode illustrates how a type converter implementation for XAML usages might query for services in one of its overrides, in this case 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);
}

Службы для сериализатора значенийServices for a Value Serializer

Для контекста сериализатора значений используется тип поставщика службы, который относится к классу ValueSerializer , IValueSerializerContext.For value serializer context, you use a service provider type that is specific to the ValueSerializer class, IValueSerializerContext. Этот контекст передается переопределениям четырех виртуальных методов ValueSerializer .That context is passed to overrides of the four ValueSerializer virtual methods. Вызовите GetService из контекста для получения служб.Call GetService from the context to obtain services.

Использование контекстов поставщиков служб XAMLUsing the XAML Service Provider Contexts

Поставщик услуг для GetService доступа к службам XAML, доступным для расширений разметки или преобразователей типов, реализуется как внутренний класс, с раскрытием только через интерфейс и с тем, как он передается в соответствующий контекст.The service provider for GetService access to XAML services available to markup extensions or type converters is implemented as an internal class, with exposure only through the interface and how it is passed into the relevant context. Каждый раз, когда операция обработки XAML в реализациях пути загрузки или пути сохранения в службах .NET по умолчанию вызывает соответствующие методы расширения разметки или преобразователя типов, для которых требуется контекст службы, этот внутренний объект передается.Whenever a XAML processing operation in the default .NET XAML Services implementations of load path or save path invokes the relevant markup extension or type converter methods that require a service context, this internal object is passed. В зависимости от ситуации контекст системной службы предоставляет MarkupExtensionContext или TextSyntaxContext, но различия этих классов не имеют значения для разработчика.Depending on the circumstance, the system service context provides either MarkupExtensionContext or TextSyntaxContext, but the specifics of both of these classes are internal. Вы взаимодействуете с ними, только запрашивая у них службы с помощью GetService.Your interaction with these classes is limited to requesting services from them, through GetService.

Доступные службы из контекста службы XAML .NETAvailable Services from the .NET XAML Service Context

Службы XAML .NET определяют службы для расширений разметки, преобразователей типов, сериализаторов значений и потенциально других использований..NET XAML Services defines services for markup extensions, type converters, value serializers, and potentially other usages. В следующих разделах описана каждая из этих служб и предоставлены рекомендации по их использованию в реализации.The following sections describe each of these services and provide guidance about how the service might be used in an implementation.

IServiceProviderIServiceProvider

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

Относится к: Основные операции с инфраструктурой на основе служб в .NET, чтобы можно было вызвать IServiceProvider.GetService .Relevant to: Basic operation of a service-based infrastructure in .NET so that you can call IServiceProvider.GetService.

ITypeDescriptorContextITypeDescriptorContext

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

Происходит от IServiceProvider.Derives from IServiceProvider. Этот класс представляет контекст в стандартных сигнатурах TypeConverter . TypeConverter — это класс, существовавший начиная с .NET Framework 1.0.This class represents context in the standard TypeConverter signatures; TypeConverter is a class that has existed since .NET Framework 1.0. Эта реализация предшествовала XAML и сценариям XAML TypeConverter для преобразования строковых типов.It predates XAML and the XAML TypeConverter scenario for string-value type conversion. В контексте служб XAML .NET методы TypeConverter реализуются явным образом.In .NET XAML Services context, methods of TypeConverter are implemented explicitly. Явная реализация указывает вызывающим объектам, что ITypeDescriptorContext API не связан с системами типов XAML, а также чтением или записью объектов в XAML.The explicit implementation's behavior indicates to callers that the ITypeDescriptorContext API is not relevant for XAML type systems, or for reading or writing objects from XAML. Container, Instance и PropertyDescriptor обычно возвращают null из КОНТЕКСТОВ служб XAML .NET.Container, Instance, and PropertyDescriptor generally return null from .NET XAML Services contexts.

IValueSerializerContextIValueSerializerContext

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

Это производный от ITypeDescriptorContext класс, который также использует явные реализации для подавления ложных выводов о системе типов XAML.Derives from ITypeDescriptorContext and also relies on explicit implementations to suppress false implications about the XAML type system. Поддерживает статические вспомогательные методы поиска в ValueSerializer.Supports the static lookup helper methods on ValueSerializer.

IXamlTypeResolverIXamlTypeResolver

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

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

Область применения: сценарии пути загрузки и взаимодействие с контекстом схемы языка XAMLRelevant to: Load path scenarios, and interaction with XAML schema context

API службы: ResolveService API: Resolve

Может влиять на сопоставление типов XAML в CLR, необходимое, когда средство записи XAML создает объект среды CLR в графе объектов.Can influence the XAML-to-CLR type mapping that is necessary when the XAML writer constructs a CLR object in an object graph. Resolve обрабатывает потенциально содержащую префикс строку, которая соответствует имени типа XAML (XamlType.Name) и возвращает Typeсреды CLR.Resolve processes a potentially prefix-qualified string that corresponds to a XAML type name (XamlType.Name), and returns a CLR Type. Разрешение типов обычно сильно зависит от контекста схемы XAML.Resolving types is typically heavily dependent on XAML schema context. Только контекст схемы языка XAML учитывает, какие сборки загружаются и какие из них можно или нужно использовать для разрешения типов.Only the XAML schema context is aware of considerations such as which assemblies are loaded, and which of these assemblies can or should be accessed for type resolution.

IUriContextIUriContext

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

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

Область применения: обработка пути загрузки и сохранения значений элементов, которые представляют собой URI или значения x:Uri .Relevant to: Load path and save path handling of member values that are URIs or x:Uri values.

API службы: BaseUriService API: BaseUri

Эта служба сообщает глобально доступный корневой URI, если таковой имеется.This service reports a globally available URI root, if any. Корневой URI можно использовать для разрешения относительных URI в абсолютные или наоборот.The URI root can be used to resolve relative URIs to absolute URIs or vice versa. Этот сценарий, в основном, относится к службам приложений, предоставляемым конкретной платформой, или возможностям часто используемого класса корневого элемента в платформе.This scenario is mainly relevant to application services that are exposed by a particular framework, or capabilities of a frequently used root element class in a framework. Базовый URI может быть установлен как параметр средства чтения XAML, который затем передается объекту средства записи XAML и предоставляется этой службой.The base URI can be established as a XAML reader setting, which is then passed through to the XAML object writer and reported by this service.

IAmbientProviderIAmbientProvider

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

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

Область применения: обработки пути загрузки и задержка или оптимизация поиска типов.Relevant to: Load path handling and type lookup deferrals or optimizations.

API-интерфейсы службы: GetAllAmbientValues , три других. Service APIs: GetAllAmbientValues, three others.

Понятие окружения в XAML — это метод пометки конкретного члена типа как внешнего.The ambience concept in XAML is a technique for marking a particular member of a type as ambient. Или же тип может быть внешним, чтобы все значения свойств, хранящих экземпляр типа, считались внешними свойствами.Alternatively, a type can be ambient so that all property values that hold an instance of the type should be considered ambient properties. Расширения разметки или преобразователи типов, находящиеся ниже вдоль потока узлов XAML и являющиеся потомками в графе объектов, могут получить доступ к внешнему свойству или экземпляру типа во время загрузки. Также они могут использовать знание внешней структуры, чтобы сэкономить время.Markup extensions or type converters that are further along the XAML node stream and that are descendants in the object graph can access the ambient property or type instance at load time; or they can use knowledge of the ambient structure at save time. Это может повлиять на степень определенности, необходимую для разрешения типов для других служб, таких как IXamlTypeResolver или x:Type.This can affect the degree of qualification that is needed to resolve types for other services, such as for IXamlTypeResolver or for x:Type. См. также раздел AmbientPropertyValue.See also AmbientPropertyValue.

IXamlSchemaContextProviderIXamlSchemaContextProvider

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

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

Область применения: путь загрузки и любые операции, которым необходимо разрешить тип XAML в базовый тип.Relevant to: Load path, and any operation that must resolve a XAML type to a backing type.

API службы: SchemaContextService API: SchemaContext

Контекст схемы XAML необходим для всех отложенных операций загрузки, так как этот же контекст схемы должен применяться в отложенной области, чтобы интегрировать отложенное содержимое.XAML schema context is necessary for any defer load operations, because the same schema context must act on the deferred area in order to integrate the deferred content. Дополнительные сведения о роли контекста схемы XAML см. в разделе XAML Services.For more information about the role of the XAML schema context, see XAML Services.

IRootObjectProviderIRootObjectProvider

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

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

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

API службы: RootObjectService API: RootObject

Эта служба относится к службам приложений, предоставляемым конкретной платформой, или возможностям часто используемого класса корневого элемента в платформе.The service is relevant to application services that are exposed by a particular framework or by capabilities of a frequently used root element class in a framework. Один из сценариев получения корневого объекта — подключение фонового кода и привязка событий.One scenario for obtaining the root object is connecting code-behind and event wiring. Например, реализация x:Class в WPF используется для компиляции разметки и привязки всех атрибутов обработчиков событий, находящихся в другом месте в разметке XAML.For example, the WPF implementation of x:Class is used for markup compile and wiring of any event handler attribute that is found at any other position in the XAML markup. Точка подключения разметки и определенных в фоновом коде разделяемых классов для компиляции разметки находится в корневом элементе.The connection point of markup and code-behind defined partial classes for markup compile is at the root element.

IXamlNamespaceResolverIXamlNamespaceResolver

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

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

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

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

IXamlNamespaceResolver — это служба, которая может вернуть идентификатор или URI пространства имен XAML, используя его префикс, сопоставленный в исходной разметке XAML.IXamlNamespaceResolver is a service that can return a XAML namespace identifier / URI based on its prefix as mapped in the originating XAML markup.

IProvideValueTargetIProvideValueTarget

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

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

Область применения: путь загрузки, путь сохранения.Relevant to: Load path and save path.

API-интерфейсы службы: TargetObject , TargetProperty . Service APIs: TargetObject, TargetProperty.

IProvideValueTarget позволяет преобразователям типов и расширениям разметки получать контекст расположения во время загрузки.IProvideValueTarget enables a type converter or markup extension to obtain context about where it is acting at load time. Реализации могут применять этот контекст, чтобы сделать использование недействительным.Implementations might use this context to invalidate a usage. Например, WPF располагает логикой внутри некоторых расширений разметки, таких как DynamicResourceExtension.For example, WPF has logic inside some of its markup extensions such as DynamicResourceExtension. Эта логика проверяет TargetProperty , чтобы убедиться в том, что расширение используется только для задания свойств зависимостей (или краткого списка других свойств, не относящихся к зависимостям).The logic checks the TargetProperty to make sure that the extension is only used to set dependency properties (or a short list of other non-dependency properties).

IXamlNameResolverIXamlNameResolver

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

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

Относится к: Определение графа объекта пути загрузки, разрешение объектов, x:Name определенных x:Reference методами, или, специфичными для платформы.Relevant to: Load path object graph definition, resolving objects identified by x:Name, x:Reference, or framework-specific techniques.

API службы: Resolve; другие интерфейсы API для более сложных сценариев, таких как работа с прямыми ссылками.Service APIs: Resolve; other APIs for more advanced scenarios such as dealing with forward references.

Реализация обработки в службах XAML .NET x:Reference зависит от этой службы..NET XAML Services implementation of x:Reference handling relies on this service. Определенные платформы или средства, поддерживающие платформу, используют эту службу для обработки x:Name или эквивалентной обработки свойств (с атрибутамиRuntimeNamePropertyAttribute ).Specific frameworks or tools that support the framework use this service for x:Name handling or equivalent (RuntimeNamePropertyAttribute attributed) property handling.

IDestinationTypeProviderIDestinationTypeProvider

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

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

Область применения: разрешение пути загрузки дополнительных сведений о типе CLR.Relevant to: Load path resolution of indirect CLR type information.

API службы:GetDestinationTypeService API: GetDestinationType

Для получения дополнительной информации см. IDestinationTypeProvider.For more information, see IDestinationTypeProvider.

См. такжеSee also