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 façon dont une production XAML qui utilise un vocabulaire XAML particulier interagit avec le comportement d’écriture d’objet, notamment la résolution du mappage de type, le chargement des assemblys, la façon dont 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, comme les membres XamlMember ou XamlType, ou via des API exposées sur les lecteurs XAML et les enregistreurs XAML qui utilisent le contexte de 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 XAML ou un enregistreur XAML à l’aide d’API qui ne prennent 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 inclut l’examen de la définition du CLR Type, et connexe PropertyInfo ou MethodInfo. En outre, l’attribution CLR sur les types ou les membres est utilisée pour renseigner les spécificités pour les informations de type XAML ou de membre XAML qui utilisent le type de stockage CLR. Le contexte de schéma XAML par défaut ne nécessite pas de techniques d’extension de 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 de 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 types de fonctionnalités qui peuvent être introduites en implémentant un contexte de schéma XAML non par défaut. En outre, le concept de contexte de schéma XAML n’est pas abordé beaucoup dans la documentation WPF qui traite du code XAML WPF ; le comportement activé par le contexte de schéma XAML peut ê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.
Remplacements de recherche : WPF a quelques con mode tente ls pour XAML où il existe des propriétés de contenu XAML qui fonctionnent sans être ContentPropertyAttribute attribuées. LookupContentProperty remplacements pour WPF implémentent ce comportement.
Report pour les expressions WPF : WPF propose plusieurs classes d’expressions qui reportent une valeur jusqu’à ce qu’un contexte d’exécution soit disponible. En outre, l’extension de modèle est un comportement d’exécution qui s’appuie sur des techniques de report.
Optimisations de recherche du système de type : WPF a un vocabulaire XAML complet et un modèle objet, y compris 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 fournit des améliorations des performances par rapport au contexte de schéma XAML par défaut et à sa recherche de type 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 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 donner à ces concepts une meilleure visibilité des opérations de traitement XAML, WPF étend XamlType et XamlMemberajoute des propriétés internes qui signalent la propriété de dépendance et les caractéristiques des événements routés.
Accès au contexte de schéma XAML WPF
Si vous utilisez des techniques XAML basées sur WPF ou System.Windows.Markup.XamlWriter, le contexte de schéma XAML WPF System.Windows.Markup.XamlReader est déjà utilisé sur ces implémentations de lecteur XAML et d’enregistreur 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 pourrez peut-être obtenir un contexte de schéma XAML WPF opérationnel à partir de XamlReader.GetWpfSchemaContext. Vous pouvez ensuite utiliser cette valeur comme initialisation pour d’autres API qui utilisent un XamlSchemaContext. Par exemple, vous pouvez appeler XamlXmlReader l’initialisation et passer le contexte de schéma XAML WPF. Vous pouvez également utiliser le contexte de schéma XAML WPF pour les opérations système de type XAML. Cela peut inclure l’initialisation de construction d’un XamlType ou XamlMember, ou d’appel XamlSchemaContext.GetXamlType.
Notez que si vous accédez à certains aspects du code XAML WPF à partir d’un point de vue de flux de nœuds XAML pur, certaines des fonctionnalités du framework WPF n’ont peut-être pas encore agi. 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 visuelle complète, vous pouvez voir uniquement 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 à partir d’une situation non runtime et peut entraîner des exceptions lors de la tentative d’écriture d’un graphique d’objet.
Chargement xaml et assembly
Le chargement d’assembly pour les services XAML et .NET XAML s’intègre au concept défini par CLR de AppDomain. Un contexte de schéma XAML interprète comment charger des assemblys ou rechercher des types au moment de l’exécution ou au moment de la conception, en fonction de l’utilisation et d’autres AppDomain facteurs. La logique est légèrement différente selon que le CODE XAML est libre pour un lecteur XAML, est compilé en XAML dans une DLL par XamlBuildTask
, ou est BAML généré par wpF PresentationBuildTask
.
Le contexte de schéma XAML pour WPF s’intègre au modèle d’application WPF, qui utilise AppDomain à son tour ainsi que d’autres facteurs qui sont des détails d’implémentation WPF.
Entrée de lecteur XAML (XAML libre)
Le contexte de schéma XAML effectue une itération dans l’application AppDomain , 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.
Sinon, l’une des techniques suivantes basée sur l’API CLR Assembly est utilisée pour charger un assembly :
Si le nom est qualifié dans le mappage, appelez Assembly.Load(String) le nom qualifié.
Si l’étape précédente échoue, utilisez le nom court (et le jeton de clé publique le cas échéant) pour appeler Assembly.Load(String).
Si le nom n’est pas qualifié dans le mappage, appelez Assembly.LoadWithPartialName.
XamlBuildTask
XamlBuildTask
est utilisé pour Windows Communication Foundation (WCF) et Windows Workflow Foundation.
Notez que les références d’assembly par le biais XamlBuildTask
sont toujours complètes.
Appelez Assembly.Load(String) le nom qualifié.
Si l’étape précédente échoue, utilisez le nom court (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 fichier 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 de laquelle charger le balisage est toujours non qualifiée.
Le contexte de schéma XAML WPF effectue une itération dans l’application AppDomain WPF, 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.
Si l’étape précédente échoue, utilisez le nom court (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 complètes, en tant que sortie de la tâche de génération.
Le contexte de schéma XAML WPF effectue une itération dans l’application AppDomain WPF, 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.
Sinon, l’une des techniques suivantes est utilisée pour charger un assembly :
Appelez Assembly.Load(String) le nom qualifié.
Si un nom court + combinaison de jetons de clé publique correspond à l’assembly à partir duquel le BAML a été chargé, utilisez cet assembly.
Utilisez un nom court + jeton de clé publique pour appeler Assembly.Load(String).
Voir aussi
.NET Desktop feedback