Partager via


Contextes de services disponibles aux convertisseurs de types ou aux extensions de balisage

Les auteurs des types qui prennent en charge les utilisations de convertisseurs de type et d'extension de balisage doivent souvent disposer d'informations contextuelles concernant l'emplacement où une utilisation existe dans le balisage ou dans la structure de graphique d'objets environnante. Les informations peuvent être exigées afin que l'objet fourni soit correctement instancié ou que les références d'objet à des objets existants dans le graphique d'objets puissent être créées. Lors de l'utilisation des services XAML .NET Framework, le contexte qui peut être requis est exposé sous la forme d'une série d'interfaces de service. Le code de prise en charge de convertisseur de type ou d'extension de balisage peut lancer une requête pour un service, à l'aide d'un contexte de fournisseur de services disponible et passé à partir de XamlObjectWriter ou des types associés. Le contexte de schéma XAML est directement disponible via un service de ce type. Cette rubrique décrit comment accéder aux contextes de service à partir d'une implémentation de convertisseur de valeurs et répertorie les services qui sont généralement disponibles et leurs rôles.

Cette rubrique comprend les sections suivantes.

  • Obtention de services
  • Services pour une extension de balisage
  • Services pour un convertisseur de type
  • Services pour un sérialiseur de valeur
  • Utilisation de contextes de fournisseurs de services XAML
  • Services disponibles à partir du contexte de service XAML .NET Framework
  • Rubriques connexes

Obtention de services

En tant qu'implémenteur de convertisseur de valeur, vous devez souvent accéder à des types de contextes dans lesquels le convertisseur de valeur est appliqué. Ce contexte peut inclure des informations telles que le contexte de schéma XAML actif, l'accès au système du mappage du type que fournissent le contexte de schéma XAML et le writer d'objet XAML, etc. Les services disponibles pour une implémentation d'extension de balisage ou de convertisseur de type sont communiqués via les paramètres de contexte qui font partie de la signature de chacune des méthodes virtuelles. Dans tous les cas, IServiceProvider est implémenté dans le contexte et vous pouvez appeler IServiceProvider.GetService pour demander un service.

Services pour une extension de balisage

MarkupExtension dispose d'une seule méthode virtuelle, ProvideValue. Le paramètre serviceProvider d'entrée décrit comment les services sont communiqués aux implémentations lorsque l'extension de balisage est appelée par un processeur XAML. Le pseudo-code suivant illustre comment une implémentation d'extension de balisage peut lancer une requête pour les services dans sa 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 pour un convertisseur de type

TypeConverter dispose de quatre méthodes virtuelles qui utilisent un contexte de service et qui prennent en charge des utilisations XAML. Chacune de ces méthodes passe un paramètre context d'entrée. Ce paramètre est de type ITypeDescriptorContext, mais cette interface hérite de IServiceProvider ; par conséquent, il existe une méthode GetService disponible pour les implémentations de convertisseurs de type.

Le pseudo-code suivant illustre comment une implémentation de convertisseur de type pour les utilisations XAML peut lancer une requête pour les services dans l'une de ses substitutions, dans ce cas, 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 pour un sérialiseur de valeur

Pour le contexte du sérialiseur de valeur, utilisez un type de fournisseur de services spécifique à la classe ValueSerializer, IValueSerializerContext. Ce contexte est passé aux substitutions des quatre méthodes virtuelles ValueSerializer. Appelez GetService à partir du contexte pour obtenir des services.

Utilisation de contextes de fournisseurs de services XAML

Le fournisseur de services pour l'accès GetService aux services XAML disponibles pour les extensions de balisage ou les convertisseurs de type est implémenté en tant que classe interne, avec une exposition uniquement via l'interface et selon la manière dont il est passé dans le contexte pertinent. Cet objet interne est passé dès qu'une opération de traitement XAML dans les implémentations des services XAML .NET Framework par défaut du chemin de chargement ou du chemin d'enregistrement appelle les méthodes d'extension de balisage ou de convertisseur de type appropriées qui requièrent un contexte de service. Selon le cas, le contexte de service du système fournit MarkupExtensionContext ou TextSyntaxContext, mais les informations de ces deux classes sont internes. Votre interaction avec ces classes est limitée à la demande de services pour celles-ci, via GetService.

Services disponibles à partir du contexte de service XAML .NET Framework

Les services XAML .NET Framework définissent des services pour les extensions de balisage, les convertisseurs de types, les sérialiseurs de valeurs et d'autres utilisations éventuelles. Les sections suivantes décrivent chacun de ces services et fournissent des conseils sur la manière dont le service peut être utilisé par une implémentation.

IServiceProvider

Documentation de référence : IServiceProvider

S'applique à l'élément suivant : fonctionnement de base d'une infrastructure du .NET Framework reposant sur les services, afin que vous puissiez appeler IServiceProvider.GetService.

ITypeDescriptorContext

Documentation de référence : ITypeDescriptorContext

Dérive de IServiceProvider. Cette classe représente le contexte dans les signatures TypeConverter standard ; TypeConverter est une classe qui existe depuis le .NET Framework version 1.0, ce qui a pour effet d'antidater XAML et le scénario TypeConverter XAML pour la conversion de type valeur de chaîne. Dans le contexte des services XAML .NET Framework, les méthodes de TypeConverter sont implémentées explicitement. Le comportement de l'implémentation explicite indique aux appelants que l'API de ITypeDescriptorContext n'est pas appropriée pour les systèmes de type XAML, ni pour la lecture ou l'écriture d'objets à partir de XAML. Container, Instance et PropertyDescriptor retournent généralement la valeur null à partir des contextes des services XAML .NET Framework.

IValueSerializerContext

Documentation de référence : IValueSerializerContext

Dérive de ITypeDescriptorContext et repose également sur des implémentations explicites pour supprimer de fausses conséquences concernant le système de type XAML. Prend en charge les méthodes d'assistance de recherche statiques sur ValueSerializer.

IXamlTypeResolver

Documentation de référence : IXamlTypeResolver

Défini par : l'espace de noms System.Windows.Markup, l'assembly System.Xaml

S'applique à : scénarios de chemin de chargement et interaction avec le contexte de schéma XAML

API de service : Resolve

Influence potentiellement le mappage de type de XAML à CLR, nécessaire lorsque le writer XAML crée un objet CLR dans un graphique d'objets. Resolve traite une chaîne potentiellement qualifiée par préfixe qui correspond à un nom de type XAML (XamlType.Name) et qui retourne un CLR Type. La résolution de types dépend en général fortement du contexte de schéma XAML. Seul le contexte de schéma XAML tient compte de considérations telles que les suivantes : quels assemblys sont chargés et lesquels d'entre eux peuvent ou doivent être accessibles pour la résolution de type.

IUriContext

Documentation de référence : IUriContext

Défini par : l'espace de noms System.Windows.Markup, l'assembly System.Xaml

S'applique à l'élément suivant : gestion du chemin de chargement et du chemin d'enregistrement des valeurs de membres qui sont des URI/valeurs x:Uri.

API de service : BaseUri

Ce service signale une racine URI globalement disponible, le cas échéant. La racine URI peut être utilisée pour résoudre des URI relatifs en URI absolus; ou inversement. Ce scénario s'applique principalement aux services d'application exposés par une infrastructure particulière, ou des fonctions d'une classe d'élément racine communément utilisée dans une infrastructure. L'URI de base peut être établi comme un paramètre de lecteur XAML, qui est ensuite passé au writer d'objet XAML et signalé par ce service.

IAmbientProvider

Documentation de référence : IAmbientProvider

Défini par : l'espace de noms System.Xaml, l'assembly System.Xaml

S'applique à : gestion de chemin de chargement et différés ou optimisations de recherche de type.

API de service : GetAllAmbientValues, 3 autres.

Le concept d'ambiance dans XAML est une technique permettant de marquer un membre particulier d'un type comme ambiant. Un type peut également être ambiant afin que toutes les valeurs de propriété qui contiennent une instance du type soient considérées comme des propriétés ambiantes. Les extensions de balisage ou les convertisseurs de type qui se trouvent plus loin dans le flux de nœud XAML et qui sont des descendants dans le graphique d'objets peuvent accéder à la propriété ambiante ou à l'instance de type lors du chargement, ou utiliser les connaissances de la structure ambiante lors de l'enregistrement. Cela peut affecter le degré de qualification requis pour résoudre des types pour d'autres services, comme par exemple IXamlTypeResolver ou x:Type. Voir aussi AmbientPropertyValue.

IXamlSchemaContextProvider

Documentation de référence : IXamlSchemaContextProvider

Défini par : l'espace de noms System.Xaml, l'assembly System.Xaml

S'applique à : chemin de chargement et toute opération qui doit résoudre un type XAML en type de stockage.

API de service : SchemaContext

Le contexte de schéma XAML est nécessaire pour toutes les opérations de chargement différé, car le même contexte de schéma doit agir sur la zone différée pour intégrer le contenu différé. Pour plus d'informations sur le rôle du contexte de schéma XAML, consultez Services XAML.

IRootObjectProvider

Documentation de référence : IRootObjectProvider

Défini par : l'espace de noms System.Xaml, l'assembly System.Xaml

S'applique à : chemin de chargement.

API de service : RootObject

Ce service s'applique aux services d'application exposés par une infrastructure particulière, ou des fonctions d'une classe d'élément racine communément utilisée dans une infrastructure. Un scénario pour l'obtention de l'objet racine connecte le code-behind et la connexion d'événements. Par exemple, l'implémentation WPF de x:Class est utilisée pour la compilation de balisage et la connexion de tout attribut de gestionnaire d'événements à n'importe quelle autre position dans le balisage XAML. Le point de connexion des classes partielles définies par le balisage et le code-behind pour la compilation du balisage se trouve au niveau de l'élément racine.

IXamlNamespaceResolver

Documentation de référence : IXamlNamespaceResolver

Défini par : l'espace de noms System.Xaml, l'assembly System.Xaml

S'applique à : chemin de chargement, chemin d'enregistrement.

API de service : GetNamespace pour le chemin de chargement et GetNamespacePrefixes pour le chemin d'enregistrement.

IXamlNamespaceResolver est un service qui peut retourner un identificateur d'espace de noms XAML/URI en fonction de son préfixe, tel qu'il est mappé dans le balisage XAML d'origine.

IProvideValueTarget

Documentation de référence : IProvideValueTarget

Défini par : l'espace de noms System.Windows.Markup, l'assembly System.Xaml

S'applique à : chemin de chargement et chemin d'enregistrement.

APIs de service : TargetObject, TargetProperty.

IProvideValueTarget permet à un convertisseur de type ou à une extension de balisage d'obtenir le contexte concernant l'emplacement d'action lors du chargement. Les implémentations peuvent utiliser ce contexte pour invalider une utilisation. Par exemple, certaines des extensions de balisage de WPF telles que DynamicResourceExtension utilisent une logique. Celle-ci vérifie la propriété TargetProperty pour s'assurer que l'extension est utilisée uniquement pour définir des propriétés de dépendance (ou une liste courte de propriétés autres que celles de dépendance).

IXamlNameResolver

Documentation de référence : IXamlNameResolver

Défini par : l'espace de noms System.Xaml, l'assembly System.Xaml

S'applique aux éléments suivants : définition du graphique d'objet du chemin de chargement, résolution des objets identifiés par x:Name, x:Reference ou des techniques spécifiques à l'infrastructure.

API de service : Resolve ; autres API pour les scénarios plus avancés tels que l'utilisation de références anticipées.

L'implémentation par les services XAML .NET Framework de la gestion de x:Reference repose sur ce service. Les infrastructures ou les outils spécifiques qui prennent en charge l'infrastructure utilisent ce service pour la gestion x:Name ou la gestion de propriété (RuntimeNamePropertyAttribute attribué) équivalente.

IDestinationTypeProvider

Documentation de référence : IDestinationTypeProvider

Défini par : l'espace de noms System.Xaml, l'assembly System.Xaml

S'applique à : résolution de chemin de chargement d'informations indirectes de type CLR.

API de service :GetDestinationType

Pour plus d'informations, consultez IDestinationTypeProvider.

Voir aussi

Référence

MarkupExtension

XamlObjectWriter

Autres ressources

Vue d'ensemble des extensions de balisage pour XAML

Vue d'ensemble des convertisseurs de types pour XAML