Partager via


Fournisseurs de fonctionnalités et connecteurs de fonctionnalités

Tout objet concevable dans une application Windows Presentation Foundation (WPF) ou Silverlight peut exposer un nombre arbitraire d'extensions de concepteur. La rubrique suivante explique les fonctionnalités des fournisseurs de fonctionnalités et le rôle des connecteurs de fonctionnalités dans le cadre de la fourniture de fonctionnalités au moment du design.

Notions de base des fournisseurs de fonctionnalités et des connecteurs de fonctionnalités

Un fournisseur de fonctionnalités est un type léger qui fournit des fonctionnalités au moment du design supplémentaires pour un objet. Certains fournisseurs de fonctionnalités peuvent fournir uniquement des informations sur les sous-composants et ne nécessitent aucune action de la part du concepteur. D'autres fournisseurs de fonctionnalités peuvent ajouter des éléments de menu au menu contextuel de concepteur de l'objet, créer des ornements personnalisés à des fins de redimensionnement ou de modification, ou encore redéfinir l'opération de glisser-déplacer d'objets dans le concepteur.

Les fournisseurs de fonctionnalités sont implémentés par dérivation directe de la classe FeatureProvider ou d'une classe qui est elle-même dérivé de FeatureProvider (par exemple, AdornerProvider et ContextMenuProvider). Conçus pour être légers, les fournisseurs de fonctionnalités ne doivent pas essayer d'enregistrer l'état entre des instances.

Un connecteur de fonctionnalités gère un ou plusieurs fournisseurs de fonctionnalités pour un objet donné. Les connecteurs de fonctionnalités peuvent publier de nouveaux services via un fournisseur de services et écouter les événements du concepteur, comme la modification d'une sélection. Les connecteurs de fonctionnalités sont implémentés en dérivant une nouvelle classe de la classe FeatureConnector<TFeatureProviderType> ou PolicyDrivenFeatureConnector<TFeatureProviderType>.

Fournisseurs de fonctionnalités

Un fournisseur de fonctionnalités est conçu pour être un point d'extensibilité léger. Les scénarios courants impliquant l'extensibilité du concepteur privilégient la dérivation à partir de classes existantes d'un fournisseur de fonctionnalités, plutôt que la création de connecteurs de fonctionnalités. Les fournisseurs de fonctionnalités ne doivent pas enregistrer l'état, car ils sont créés et détruits plusieurs fois.

Les fournisseurs de fonctionnalités sont entièrement gérés par des connecteurs de fonctionnalités et sont associés à des objets via des métadonnées, plus particulièrement FeatureAttribute. Le connecteur de fonctionnalités découvre des types FeatureProvider à partir de ces métadonnées. La classe FeatureManager identifie le connecteur de fonctionnalités requis pour chaque fournisseur de fonctionnalités découvert.

Les implémentations courantes d'un fournisseur de fonctionnalités regroupent les ornements, les verbes et les éditeurs de propriétés. Pour plus d'informations, consultez Procédure pas à pas : création d'un ornement au moment du design.

Exemples de fournisseurs de fonctionnalités

L'illustration suivante montre un concepteur visuel et les types de fonctionnalités qui peuvent être inclus dans les catégories d'un fournisseur de fonctionnalités ou d'un connecteur de fonctionnalités. Notez que l'illustration ne constitue qu'un exemple parmi d'autres indiquant l'implémentation de certaines fonctionnalités d'un concepteur.

Fournisseurs et connecteurs de fonctionnalité exemple

Le tableau suivant répertorie les fournisseurs de fonctionnalités à partir desquels vous pouvez effectuer une dérivation.

Fournisseur de fonctionnalités

Description

AdornerProvider

Ajoute des ornements à la surface du concepteur.

PrimarySelectionAdornerProvider

Ajoute des ornements affichés pour la sélection principale.

ContextMenuProvider

Définit un jeu d'éléments de menu affichés dans un menu contextuel.

PrimarySelectionContextMenuProvider

Définit un jeu d'éléments de menu affichés pour la sélection actuelle.

PolicyDrivenFeatureConnector<TFeatureProviderType>.ItemFeatureProvider

Identifie les fournisseurs de fonctionnalités qui appartiennent à un élément particulier.

TaskProvider

Ajoute des tâches à l'outil actif.

PrimarySelectionTaskProvider

Fournit un jeu de tâches qui sont disponibles dans l'outil de sélection lorsqu'une classe est dans la sélection principale.

DesignModeValueProvider

Capture les modifications de propriété apportées par l'utilisateur dans le concepteur et fournit de nouvelles valeurs au moment du design.

Création des fournisseurs de fonctionnalités au moment du design

Dans de nombreux cas, vous ne devrez pas créer vos propres connecteurs de fonctionnalités personnalisés. Vous pouvez créer un fournisseur de fonctionnalités et l'associer directement à une classe à l'aide de FeatureConnectorAttribute. La classe FeatureManager est le composant du Concepteur WPF qui active les fournisseurs de fonctionnalités. FeatureManager examine les métadonnées d'un objet dès qu'il est placé sur l'aire de conception. Si elle trouve un FeatureConnectorAttribute pour un objet, elle crée le fournisseur de fonctionnalités associé.

Par exemple, si vous souhaitez créer un ornement qui permet de modifier directement le texte d'en-tête d'un contrôle personnalisé sur l'aire du concepteur, implémentez l'ornement en le dérivant de PrimarySelectionAdornerProvider, qui dérive de FeatureProvider. Ensuite, associez l'ornement personnalisé à votre contrôle à l'aide de FeatureConnectorAttribute.

Association de fournisseurs de fonctionnalités à des types

Un outil au moment du design associe les fournisseurs de fonctionnalités à des types via des attributs de métadonnées. Il doit exister une méthode déclarative permettant de lier les métadonnées aux objets ou instances runtime réels. Cette liaison est requise au niveau de l'outil et n'est pas la responsabilité d'une infrastructure au moment du design. L'illustration suivante indique comment un outil au moment du design attache des fournisseurs de fonctionnalités à différents types.

Association des types et fournisseurs de fonctionnalités

Il existe deux façons d'associer des fournisseurs de fonctionnalités à des types dans l'architecture du Concepteur WPF : les types FeatureAttribute et FeatureConnectorAttribute. Le type FeatureAttribute est utilisé sur des types ou des instances d'objets modifiables et expose une propriété représentant FeatureProvider.

FeatureConnectorAttribute décore une classe FeatureProvider et indique le type de connecteur de fonctionnalités requis pour héberger le fournisseur de fonctionnalités spécifié. La classe FeatureManager crée les instances de FeatureConnector<TFeatureProviderType> requises lorsque vous modifiez des objets qui lui sont passés.

Prenons l'exemple d'un concepteur spécifique de WPF dans lequel les objets modifiables sont du type UIElement. Cet outil peut utiliser une ou plusieurs « poignées de manipulation » pour orner des limites d'éléments individuels. Ces ornements représentent visuellement la sélection et activent la manipulation de ces objets modifiables. Le concepteur associe une fonctionnalité de poignée de manipulation à tous les objets de type UIElement à l'aide de métadonnées. L'illustration suivante indique comment un concepteur peut attacher un fournisseur de poignées de manipulation à UIElement sur l'aire de conception.

Fournisseur de fonctionnalité exemple

Si UIElement existe et est passé au gestionnaire de fonctionnalités pour être analysé, GrabHandleProvider est découvert via les métadonnées associés à UIElement. Le type GrabHandleProvider lui-même, ou son type de base, est inspecté à l'aide de métadonnées pour déterminer son connecteur de fonctionnalités requis.

Connecteurs de fonctionnalités

Les connecteurs de fonctionnalités représentent le niveau d'extensibilité inférieur exposé par cette architecture. Les connecteurs de fonctionnalités sont créés en fonction d'une référence à EditingContext. Les connecteurs de fonctionnalités peuvent s'abonner aux services globaux et peuvent ajouter leurs propres services. La classe abstraite FeatureConnector<TFeatureProviderType> implémente l'interface IDisposable qui encourage une stratégie de nettoyage simple.

Les connecteurs de fonctionnalités sont créés sur demande. Lorsque FeatureManager découvre FeatureConnectorAttribute sur FeatureProvider, il crée le FeatureConnector<TFeatureProviderType> spécifié si son type n'existe pas encore. Les connecteurs de fonctionnalités sont créés uniquement lorsqu'ils sont découverts ; une session de concepteur ne crée donc pas de jeu par défaut au démarrage. S'il y a plusieurs types FeatureConnectorAttribute pour FeatureProvider, tous les connecteurs de fonctionnalités sont initialisés. Un tiers peut ainsi dériver d'un FeatureProvider existant, ajouter un connecteur de fonctionnalités personnalisé et initialiser les deux jeux de fonctionnalités.

La plupart des fonctionnalités de la classe FeatureConnector<TFeatureProviderType> sont implémentées dans la méthode protégée CreateFeatureProviders. Lorsqu'un objet est passé à cette méthode, le connecteur de fonctionnalités recherche les types FeatureAttribute dans l'objet. Si ces attributs sont identifiés, l'instance de FeatureProvider associée à chaque attribut est créée et retournée dans une liste.

La classe de base FeatureConnector<TFeatureProviderType> est générique et utilise le type du fournisseur de fonctionnalités hébergé par FeatureConnector<TFeatureProviderType>. Les fournisseurs de fonctionnalités utilisent FeatureConnectorAttribute pour indiquer le connecteur de fonctionnalités associé. Les méthodes de classe de base protégées de FeatureConnector<TFeatureProviderType>, essentiellement la méthode CreateFeatureProviders, peuvent retourner des collections typées de fournisseurs de fonctionnalités aux connecteurs de fonctionnalités dérivés, les classes dérivées n'étant pas affectées par le casting et la sécurité de type.

Création de connecteurs de fonctionnalités personnalisés

Vous devez créer votre propre connecteur de fonctionnalités lorsque vous souhaitez écouter les événements du concepteur, comme la sélection. Effectuez une dérivation de la classe FeatureConnector<TFeatureProviderType> ou PolicyDrivenFeatureConnector<TFeatureProviderType> pour implémenter votre logique de concepteur personnalisée.

Les connecteurs de fonctionnalités sont associés à une référence au EditingContext global du concepteur, via lequel le connecteur de fonctionnalités peut accéder aux services du concepteur, ainsi que publier ses propres services personnalisés. Par exemple, un fournisseur de contrôles de graphique peut publier un service qui permet à un éditeur de types personnalisé dans le concepteur d'énumérer tous les widgets actuellement situés sur le graphique.

Après avoir créé une classe dérivée de FeatureConnector<TFeatureProviderType>, vous pouvez l'associer à un fournisseur de fonctionnalités en appliquant FeatureConnectorAttribute à votre fournisseur de fonctionnalités. Chaque fois qu'une instance de ce fournisseur de fonctionnalités est créée, FeatureManager examine les métadonnées pour FeatureConnectorAttribute. Si l'attribut est défini et qu'une instance du FeatureConnector<TFeatureProviderType> associé n'est pas en cours d'exécution, FeatureManager la crée et associe toutes les instances ultérieures de ce fournisseur de fonctionnalités à FeatureConnector<TFeatureProviderType>.

Pour obtenir un exemple de code qui indique comment implémenter un connecteur de fonctionnalités, consultez Comment : créer un connecteur de fonctionnalités personnalisé.

Voir aussi

Référence

AdornerProvider

EditingContext

FeatureManager

FeatureConnectorAttribute

Autres ressources

Extensibilité du Concepteur WPF