Contexte de schéma XAML par défaut et contexte de schéma XAML WPF

Un contexte de schéma XAML est une entité conceptuelle qui qualifie la manière dont une production XAML qui utilise un vocabulaire XAML particulier interagit avec le comportement d’écriture d’objet, notamment comment le mappage de type est résolu, comment les assemblys sont chargés, comment certains paramètres de lecteur et d’enregistreur sont interprétés. Cette rubrique décrit les fonctionnalités des services XAML .NET et le contexte de schéma XAML par défaut associé, qui est basé sur le système de type CLR. Cette rubrique décrit également le contexte de schéma XAML utilisé pour WPF.

Contexte de schéma XAML par défaut

Les services XAML .NET implémentent et utilisent un contexte de schéma XAML par défaut. Le comportement du contexte de schéma XAML par défaut n’est pas toujours entièrement visible dans l’API de la XamlSchemaContext classe. Toutefois, dans de nombreux cas, le comportement que le contexte de schéma XAML par défaut influence est observable via l’API commune du système de type XAML, tel que les membres de ou XamlType , ou via les API exposées sur les lecteurs XAML et les writers XAML qui utilisent le contexte de XamlMember schéma XAML par défaut.

Vous pouvez créer un XamlSchemaContext qui encapsule le comportement par défaut en appelant le XamlSchemaContext constructeur. Cela crée explicitement le contexte de schéma XAML par défaut. Le même contexte de schéma XAML par défaut est créé implicitement, si vous initialisez un lecteur ou un writer XAML à l’aide d’API qui n’acceptent pas explicitement un XamlSchemaContext paramètre d’entrée.

Le contexte de schéma XAML par défaut s’appuie sur la réflexion CLR pour son comportement de mappage de type. Cela comprend l’examen du CLR Type de définition et des éléments associés PropertyInfo ou MethodInfo . En outre, l’attribution CLR sur les types ou les membres est utilisée pour remplir les détails pour le type XAML ou les informations de membre XAML qui utilisent le type de stockage CLR. Le contexte de schéma XAML par défaut ne requiert pas de techniques d’extension du système de type, telles que le Invoker modèle, car les informations nécessaires sont disponibles à partir du système de type CLR.

Pour la logique de chargement d’assembly, le contexte de schéma XAML par défaut s’appuie principalement sur toutes les valeurs d’assembly fournies dans les mappages d’espaces de noms XAML. En outre, LocalAssembly peut indiquer un assembly à charger pour des scénarios tels que le chargement de types internes.

Contexte de schéma XAML WPF

Le contexte de schéma XAML WPF est décrit dans cette rubrique, car l’implémentation WPF fournit une illustration intéressante des genres de fonctionnalités qui peuvent être introduites par l’implémentation d’un contexte de schéma XAML autre que celui par défaut. En outre, le concept de contexte de schéma XAML n’est pas abordé très bien dans la documentation WPF qui traite le XAML WPF. le comportement que le contexte de schéma XAML active peut ne pas être entièrement compréhensible s’il est intégré à une discussion sur le fonctionnement du contexte de schéma XAML par défaut. Le contexte de schéma XAML WPF implémente le comportement suivant.

Substitutions de recherche : WPF dispose de quelques modèles de contenu pour XAML, où il existe des propriétés de contenu XAML qui fonctionnent sans ContentPropertyAttribute attributs. LookupContentProperty les substitutions pour WPF implémentent ce comportement.

Report pour les expressions WPF : WPF propose plusieurs classes d’expressions qui diffèrent une valeur jusqu’à ce qu’un contexte d’exécution soit disponible. En outre, l’expansion de modèle est un comportement d’exécution qui s’appuie sur les techniques de report.

Optimisations de recherche de système de type : WPF possède un vocabulaire XAML et un modèle objet étendus, notamment des définitions de membres de classe de base qui héritent littéralement de centaines de classes définies par WPF. En outre, WPF lui-même est réparti sur plusieurs assemblys. WPF optimise sa recherche de type à l’aide de tables de recherche et d’autres techniques. Cela permet d’améliorer les performances par rapport au contexte de schéma XAML par défaut et à sa recherche de type basée sur le CLR. Dans les cas où les types n’existent pas dans une table de recherche, le comportement utilise des techniques de contexte de schéma XAML qui sont similaires au contexte de schéma XAML par défaut.

Extension XamlType et XamlMember : WPF étend les concepts de propriété avec les propriétés de dépendance et les concepts d’événement avec des événements routés. Pour offrir à ces concepts une meilleure visibilité pour les opérations de traitement XAML, WPF étend XamlType et XamlMember , et ajoute des propriétés internes qui signalent les caractéristiques de la propriété de dépendance et des événements routés.

Accès au contexte de schéma XAML WPF

Si vous utilisez des techniques XAML basées sur WPF System.Windows.Markup.XamlReader ou System.Windows.Markup.XamlWriter , le contexte de schéma XAML WPF est déjà utilisé sur ces implémentations du lecteur XAML et du writer XAML.

Si vous utilisez d’autres implémentations de lecteur XAML ou d’enregistreur XAML qui ne s’initialisent pas avec le contexte de schéma XAML WPF, vous pouvez obtenir un contexte de schéma XAML WPF opérationnel à partir de XamlReader.GetWpfSchemaContext . Vous pouvez ensuite utiliser cette valeur comme initialisation pour une autre API qui utilise un XamlSchemaContext . Par exemple, vous pouvez appeler XamlXmlReader pour l’initialisation et passer le contexte de schéma XAML WPF. Ou vous pouvez utiliser le contexte de schéma XAML WPF pour les opérations de système de type XAML. Cela peut inclure l’initialisation de la construction d’un ou XamlMember d’un XamlType , ou l’appel XamlSchemaContext.GetXamlType de.

Notez que si vous accédez à certains aspects du XAML WPF à partir de perspectives de flux de nœud XAML pures, certaines des fonctionnalités de l’infrastructure WPF n’ont peut-être pas encore été traitées. Par exemple, les modèles WPF pour les contrôles ne sont pas encore appliqués. Par conséquent, si vous accédez à une propriété qui, au moment de l’exécution, peut être remplie avec une arborescence d’éléments visuels complète, vous ne verrez peut-être qu’une valeur de propriété qui fait référence à un modèle. Le contexte de service fourni pour les extensions de balisage WPF peut également ne pas être précis s’il est fourni par une situation qui n’est pas du moment de l’exécution et peut entraîner des exceptions lors de la tentative d’écriture d’un graphique d’objet.

XAML et chargement d’assembly

Le chargement d’assembly pour XAML et les services XAML .NET s’intègre au concept défini par le CLR de AppDomain . Un contexte de schéma XAML interprète la manière de charger des assemblys ou de rechercher des types au moment de l’exécution ou de la conception, en fonction de l’utilisation de et d' AppDomain autres facteurs. La logique est légèrement différente selon que le XAML est un XAML libre pour un lecteur XAML, qu’il est compilé dans une DLL par XamlBuildTask ou qu’il est généré par PresentationBuildTask le langage BAML.

Le contexte de schéma XAML pour WPF s’intègre au modèle d’application WPF, qui à son tour utilise AppDomain , ainsi que d’autres facteurs qui sont des détails d’implémentation WPF.

Entrée de lecteur XAML (XAML libre)

  1. Le contexte de schéma XAML itère au sein AppDomain de l’application, recherchant un assembly déjà chargé qui correspond à tous les aspects du nom, à partir de l’assembly le plus récemment chargé. Si une correspondance est trouvée, cet assembly est utilisé pour la résolution.

  2. Dans le cas contraire, l’une des techniques suivantes basées sur l’API CLR Assembly est utilisée pour charger un assembly :

XamlBuildTask

XamlBuildTaskest utilisé pour Windows Communication Foundation (WCF) et Windows Workflow Foundation.

Notez que les références d’assembly via XamlBuildTask sont toujours qualifiées complètes.

  1. Appelez Assembly.Load(String) sur le nom qualifié.

  2. Si l’étape précédente échoue, utilisez le nom abrégé (et le jeton de clé publique, le cas échéant) pour appeler Assembly.Load(String) .

BAML (PresentationBuildTask)

Il existe deux aspects du chargement d’assembly pour BAML : le chargement de l’assembly initial qui contient le code BAML en tant que composant et le chargement des assemblys de stockage de type pour tous les types référencés par la production BAML.

Chargement d’assembly pour le balisage initial :

La référence à l’assembly à partir duquel charger le balisage est toujours non qualifiée.

  1. Le contexte de schéma XAML WPF itère au sein AppDomain de l’application WPF, en recherchant un assembly déjà chargé qui correspond à tous les aspects du nom, à partir de l’assembly le plus récemment chargé. Si une correspondance est trouvée, cet assembly est utilisé pour la résolution.

  2. Si l’étape précédente échoue, utilisez le nom abrégé (et le jeton de clé publique, le cas échéant) pour appeler Assembly.Load(String) .

Références d’assembly par types BAML :

Les références d’assembly pour les types utilisés dans la production BAML sont toujours qualifiées complètes, comme sortie de la tâche de génération.

  1. Le contexte de schéma XAML WPF itère au sein AppDomain de l’application WPF, en recherchant un assembly déjà chargé qui correspond à tous les aspects du nom, à partir de l’assembly le plus récemment chargé. Si une correspondance est trouvée, cet assembly est utilisé pour la résolution.

  2. Dans le cas contraire, l’une des techniques suivantes est utilisée pour charger un assembly :

    • Appelez Assembly.Load(String) sur le nom qualifié.

    • Si une combinaison nom abrégé + jeton de clé publique correspond à l’assembly à partir duquel le BAML a été chargé, utilisez cet assembly.

    • Utilisez le nom abrégé + jeton de clé publique pour appeler Assembly.Load(String) .

Voir aussi