Partager via


Architecture de l'extensibilité du Concepteur WPF

Le Concepteur WPF pour Visual Studio est un environnement d'édition visuelle pour les éléments WPF et Silverlight. Le Concepteur WPF est basé sur une infrastructure possédant une architecture extensible que vous pouvez étendre pour créer votre propre expérience de design personnalisée.

En étendant l'infrastructure du Concepteur WPF, vous pouvez personnaliser l'apparence et le comportement au moment du design de contenu de WPF et Silverlight avec une liberté remarquable. Par exemple, vous pouvez étendre le Concepteur WPF des façons suivantes :

  • Personnaliser le déplacement et redimensionner des glyphes avec des graphiques améliorés.

  • Ajoutez un menu contextuel à l'aire de conception qui modifie l'état d'un contrôle.

  • Modifier l'apparence et le comportement d'un contrôle au moment du design pour différents outils.

L'architecture Concepteur WPF prend en charge la pleine puissance d'expression de WPF et de Silverlight. Cela permet la création de nombreuses expériences utilisateur de conception visuelles, ce qui n'était pas possible précédemment.

Pour obtenir un exemple d'implémentation d'une expérience au moment du design personnalisée pour WPF et Visual Studio, consultez Procédure pas à pas : création d'un ornement au moment du design

Pour obtenir un exemple de code qui montre comment créer des expériences de conception personnalisée pour WPF et Silverlight, consultez le site WPF Designer Extensibility Samples.

Infrastructure du Concepteur WPF

L'infrastructure du Concepteur WPF est modulaire, ce qui signifie que lorsque vous étendez les fonctionnalités au moment du design, vous étendez uniquement les éléments nécessaires à vos fonctionnalités. Vous n'avez pas à écrire beaucoup de code pour mettre en œuvre vos fonctionnalités de design personnalisées.

Le modèle objet se compose de cinq unités fonctionnelles, décrites dans le tableau suivant.

Unité fonctionnelle

Description

Modèle d'édition

Interface de programmation pour les objets dans le concepteur.

Fournisseurs de fonctionnalités

Point d'extensibilité principal dans l'infrastructure du concepteur.

Contexte d'édition

Magasin central pour l'état d'un concepteur.

Commandes, tâches et outils

Commandes, tâches et outils pour traiter l'entrée d'utilisateur.

Métadonnées au moment du design

Assemblys qui contiennent le comportement d'un contrôle au moment du design pour séparer physiquement la logique du concepteur de la logique d'exécution.

L'illustration suivante montre les unités fonctionnelles de l'infrastructure Concepteur WPF.

Modèle d'objet de niveau supérieur

Modèle d'édition

L'environnement de conception interagit avec les contrôles au moment de l'exécution via une interface de programmation appelée un modèle d'édition. Le modèle d'édition se compose de trois sous-unités fonctionnelles : un modèle, un wrapper public, qui permet d'abstraire le modèle, et une vue, qui représente l'interface utilisateur du modèle.

L'environnement de conception utilise le type ModelItem pour communiquer avec le modèle sous-jacent. Toutes les modifications sont apportées aux wrappers ModelItem, qui affectent le modèle sous-jacent. Cela permet au modèle d'être simple. Les wrappers ModelItem gèrent des fonctionnalités concepteur complexes telles que la prise en charge des transactions, le suivi des annulations et les notifications de modification.

La classe ModelService fournit le point d'entrée pour le modèle d'édition et pour les notifications d'événements globaux.

La classe ViewService mappe les représentations visuelles aux éléments de modèle sous-jacents.

Les deux services sont requis pour que le concepteur fonctionne. La classe DesignerView, qui est chargée de traiter l'entrée d'utilisateur et de la router vers les commandes, requiert ces deux services pour mapper correctement l'entrée d'utilisateur au modèle.

Fournisseurs de fonctionnalités

Vous étendez le comportement au moment du design de vos types en utilisant les classes FeatureProvider ou FeatureConnector<TFeatureProviderType>. La classe FeatureConnector<TFeatureProviderType> gère une liste d'objets FeatureProvider.

La classe FeatureProvider fournit le point d'extensibilité le plus basique. Un fournisseur de fonctionnalités est une fonctionnalité ou un complément léger qui ne requiert en général pas beaucoup de l'environnement de conception et est créé et détruit dans un contexte donné. Les fournisseurs de fonctionnalités sont utilisés pour ajouter de nouveaux éléments d'interface utilisateur à l'aire de conception ou pour modifier un comportement de base. Par exemple, un fournisseur de fonctionnalités peut ajouter plus de poignées de manipulation ou permettre un nouveau type de comportement de glissement de souris.

Pour accéder au niveau le plus élevé d'extensibilité, dérivez de la classe FeatureConnector<TFeatureProviderType>. Cette classe expose un fournisseur de services, par lequel les classes connecteur de fonctionnalités dérivées peuvent gérer des événements et des requêtes ainsi que publier des services. Par exemple, vous pouvez implémenter un connecteur de fonctionnalités pour fournir une interface utilisateur de sélection ou une sérialisation spécifique à l'objet.

En général, implémentez une fonctionnalité pour étendre des concepts existants. Implémentez un connecteur de fonctionnalités pour fournir de nouveaux concepts. Pour plus d'informations, consultez Fournisseurs de fonctionnalités et connecteurs de fonctionnalités.

Contexte d'édition

Une quantité significative d'informations d'état est accumulée dans un concepteur en cours d'exécution. Par exemple, l'état de votre concepteur peut comprendre : les objets actuellement sélectionnés ou le comportement lorsque le bouton gauche de la souris est enfoncé. L'état du concepteur est stocké en un emplacement central, afin de le trouver aisément. La classe EditingContext représente ce référentiel central des états du concepteur.

La classe EditingContext partage l'état en deux catégories : données et comportement. Les données sont stockées comme une table d'éléments de contexte et le comportement est stocké comme une table de services. Les deux tables sont indexées par une clé basée sur un type et sont énumérables.

La classe ContextItem conserve une information d'état unique dans le concepteur. Les éléments de contexte sont immuables, mais de nouveaux éléments de contexte peuvent remplacer les éléments existants pour simuler la mutabilité.

Les services sont accessibles via la propriété Services (qui retourne une instance de ServiceManager) et les éléments de contexte via la propriété Items (qui retourne une instance de ContextItemManager).

Commandes, tâches et outils

L'architecture des outils du Concepteur WPF se compose des commandes, des tâches et des outils. 

Une commande est un identificateur unique correspondant à un certain comportement. Par exemple, Couper est une commande qui permet de couper le texte actuel et de l'ajouter au Presse-papiers. Le code qui implémente Couper varie d'une application à l'autre, et peut même varier au sein d'une même application. Par exemple, la fonction Couper du texte dans un document Word possède une implémentation différente de la fonction Couper du texte dans la zone de texte Rechercher du même document. Indépendamment de l'implémentation, la commande Couper reste constante.

Le Concepteur WPF accroît le système de commandes WPF en introduisant le concept de commande d'outil. Une commande d'outil implémente l'interface ICommand et est similaire à la classe RoutedCommand.

Une tâche possède une collection de liaisons de commande, qui vous permet d'ajouter des commandes routées. La classe DesignerView détient le code qui utilise la même stratégie de routage que les commandes d'outils pour rechercher et exécuter des commandes routées définies sur les tâches. La classe DesignerView active des tâches qui prennent en charge les commandes WPF courantes, telles que Copy.

Un outil est une classe qui traite l'entrée d'utilisateur. Toute entrée d'utilisateur produit dans le concepteur un ou plusieurs événements d'entrée. Ces événements d'entrée sont passés à l'outil actuellement actif qui les convertit en liaisons d'entrée. Si une liaison d'entrée est retournée, la commande de la liaison est exécutée.

Un outil peut représenter le mode global du concepteur. Par exemple, si l'utilisateur sélectionne des composants sur l'aire de conception, ce mode de sélection est possible parce que l'outil actuellement actif offre des liaisons d'entrée et commande cette sélection de handle. Lorsque l'utilisateur crée une nouvelle instance d'un contrôle, un autre outil devient actif et offre un ensemble différent de commandes, liées aux mêmes liaisons d'entrée.

Métadonnées au moment du design

Dans l'infrastructure Concepteur WPF, les métadonnées définissant le comportement d'un contrôle au moment du design sont spécifiées par des attributs et factorisées dans un assembly distinct. Des concepteurs différents peuvent consommer des assemblys de métadonnées différents avec des implémentations au moment du design complètement différentes. Cela dissocie le comportement au moment de l'exécution et au moment du design, afin que vous puissiez modifier séparément le concepteur du contrôle.

Pour spécifier un assembly fournissant l'implémentation au moment du design, marquez-le avec le ProvideMetadataAttribute et incluez une classe qui implémente l'interface IProvideAttributeTable.

Pour plus d'informations, consultez Mise à disposition de métadonnées au moment du design.

Prise en charge au moment du design dans Expression Blend

Le Concepteur WPF prend en charge toutes les fonctionnalités dans l'infrastructure d'extensibilité. Expression Blend prend en charge les fonctionnalités suivantes.

  • Ornements

  • Menus contextuels

  • DesignModeValueProvider

  • Initialiseurs par défaut

  • Toutes les fonctionnalités ModelItem, telles que la sélection et la manipulation

  • Extensibilité des fenêtres Propriétés

Expression Blend ne prend pas en charge ParentAdapter et PlacementAdapter.

Assemblys du Concepteur WPF

Le Concepteur WPF est composé de plusieurs assemblys qui appartiennent à l'une des trois catégories suivantes : public, privé et spécifique au concepteur.

Les assemblys publics exposent des classes que vous pouvez utiliser pour ajouter de la logique au moment du design à vos contrôles.

Les assemblys privés et spécifiques au concepteur définissent l'ensemble des fonctionnalités de Concepteur WPF et ses interactions avec les concepteurs (tels que Visual Studio et Expression Blend).

Les concepteurs Silverlight et WPF sont installés comme une seule et même entité. Il n'existe pas de package distinct pour chaque concepteur.

Le tableau suivant indique la manière dont les fonctionnalités du Concepteur WPF sont déployées.

Assembly

API publique

Description

Microsoft.Windows.Design.Extensibility.dll

Oui

Fournit à un modèle d'extensibilité via des attributs et la logique d'intégration du Kit de développement Visual Studio SDK.

Microsoft.Windows.Design.Interaction.dll

Oui

Fournit une entrée d'utilisateur et des classes d'affichage.

Microsoft.Windows.Design.Markup.dll

Non

Fournit des mécanismes de modèle de document et XAML.

Microsoft.VisualStudio.Xaml.dll

Non

Fournit une fondation XAML de base pour les concepteurs via un service, une infrastructure d'intégration de données (backplane) et une manipulation des métadonnées.

Microsoft.Windows.Design.Host.dll

Non

API privée pour l'hébergement d'un concepteur (spécifique à Visual Studio).

Microsoft.Windows.Design.Developer.dll

Non

Implémentation du Concepteur WPF.

Microsoft.Windows.Design.Developer.WPF.dll

Non

Microsoft.Windows.Design.Developer.Silverlight.dll

Non

Microsoft.Windows.Design.Platform.dll

Non

Couche de plateforme avec des classes abstraites. Les implémentations de plateforme implémentent des classes abstraites dans cet assembly.

Microsoft.Windows.Design.Platform.WPF.dll

Non

Spécifique à la plateforme au moment du design pour WPF.

Microsoft.Windows.Design.Platform.Silverlight.dll

Non

Spécifique à la plateforme au moment du design pour Silverlight.

Microsoft.Expression.DesignModel.dll

Non

Assembly au moment du design Expression Blend.

Microsoft.Expression.Platform.WPF.dll

Non

Assembly au moment du design Expression Blend.

Microsoft.Expression.Platform.Silverlight.dll

Non

Assembly au moment du design Expression Blend.

Notes

Les assemblys représentent des limites de fonctionnalités et non des limites d'espace de noms. Vous rencontrerez souvent des espaces de noms qui couvrent plus d'un assembly.

Architecture du Concepteur WPF et du Concepteur Windows Forms

L'architecture du Concepteur WPF est considérablement différente de l'architecture du Concepteur Windows Forms, caractérisée par l'interface IComponent et l'espace de noms System.ComponentModel. Pour plus d'informations, consultez Comparaison entre l'infrastructure du Concepteur Windows Forms et l'infrastructure du Concepteur WPF.

Voir aussi

Concepts

Fournisseurs de fonctionnalités et connecteurs de fonctionnalités

Autres ressources

Mise à disposition de métadonnées au moment du design

Développement de contrôles Windows Forms au moment du design

Extensibilité du Concepteur WPF