2009-04-30 5 views
135

Je viens d'arriver sur WPF et j'aimerais créer un contrôle WPF réutilisable. Lorsque j'examine les options de création de projets dans Visual Studio, je vois "Bibliothèque de contrôle utilisateur WPF" et "Bibliothèque de contrôle personnalisée WPF". Je ne sais pas quelle est la différence entre eux et mes recherches Google n'ont pas donné d'explications décentes. Je voudrais comprendre les différences entre eux et idéalement voir quelques exemples de quand utiliser l'un sur l'autre.Quelle est la différence entre une bibliothèque de contrôle utilisateur et une bibliothèque de contrôle personnalisée?

+2

N'oubliez pas d'imbriquer du contenu ou de modifier le modèle d'un contrôle en tant qu'options. Vous pouvez faire des changements assez spectaculaires à un contrôle de cette façon sans avoir à écrire un contrôle personnalisé. – MichaC

+0

Juste ce que MichaC a dit. La meilleure partie de WPF est que la modélisation des contrôles existants peut avoir un impact énorme. Vous devriez exiger des contrôles personnalisés rarement. Cela ne ressemble pas à WinForms où même des changements mineurs à un contrôle nécessitaient un nouveau contrôle dérivé. –

+0

Encore utile. Avoir un autre badge d'or. – ouflak

Répondre

99

En pratique, les contrôles personnalisés sont quelque chose que vous implémentez au niveau du code alors que vous pouvez utiliser XAML pour les contrôles utilisateur. Les contrôles personnalisés étendent l'une des classes de base de contrôle WPF et fournissent des fonctionnalités supplémentaires via le code, de sorte que toute la logique et la représentation ajoutées doivent être implémentées dans le code.

Un contrôle utilisateur est techniquement un contrôle de contenu normal que vous pouvez étendre dans certaines parties du code, mais généralement il est étendu en plaçant d'autres contrôles à l'intérieur. Donc, comme Kent a mentionné un UserControl est une agrégation d'autres contrôles. Cela limite considérablement ce que vous pouvez faire avec un contrôle utilisateur. C'est plus facile à utiliser mais plus limité qu'un contrôle personnalisé complet.

Ces contrôles ont une petite différence du point de vue de l'exécution. Lors de la création d'une application et de l'insertion d'un UserControl, l'arborescence de contrôle contient un modèle UserControl concret. Donc, si nous considérons un exemple boiteux d'un bouton spécialisé. Si vous utilisiez un contrôle utilisateur, vous ajouteriez un bouton à l'intérieur de l'élément <UserControl>. Lorsque vous utilisez un contrôle personnalisé, vous dériveriez probablement le contrôle lui-même d'un bouton. La différence serait visible dans l'arbre logique.

Alors que le contrôle personnalisé fournirait un arbre logique semblable à

  • fenêtre
    • CustomButton

Le UserControl donnerait un arbre logique de

  • fenêtre
    • CustomButtonUserControl
      • Bouton

Donc à la fin UserControl est juste une ContentControl normale que vous pouvez prolonger un peu et pour lequel vous pouvez prédéfinir le contenu. Le contrôle personnalisé offre une plus grande flexibilité au prix de la facilité d'implémentation car vous devez faire toute la logique et l'interaction dans le code au lieu d'avoir l'avantage de XAML.

Après tout cela, je ne pense pas qu'il y ait autant de différence dans les modèles Visual Studio. Il est très probable que Visual Studio Custom Control crée un projet avec un contrôle personnalisé vide alors que le projet User Control est un projet avec un contrôle utilisateur vide. Vous pouvez ensuite ajouter n'importe quel type d'élément au projet.

Mise à jour

Et mon avis sur le moment d'utiliser le contrôle personnalisé et le contrôle de l'utilisateur est que si vous pouvez faire quelque chose avec un contrôle utilisateur et l'élément de commande supplémentaire dans l'arborescence logique ne vous dérange pas, utiliser un contrôle utilisateur car ils sont tellement plus faciles à créer et à maintenir. Utilisez un contrôle personnalisé uniquement si vous avez une raison de ne pas utiliser un contrôle utilisateur.

+1

Un contrôle personnalisé peut-il être utilisé pour agréger d'autres contrôles? –

+0

Et qu'en est-il du problème skinnable/templatable? –

+1

Vous ne savez pas exactement ce que vous entendez par agrégation. Vous ne pouvez pas créer un contrôle personnalisé en agrégeant d'autres contrôles. Vous pouvez toutefois dériver d'un contrôle Panel tel que StackPanel, Grid ou Panel lui-même afin de pouvoir implémenter un conteneur de disposition avec un contrôle personnalisé (Vous ne savez pas si vous pouvez le faire avec un contrôle utilisateur). –

21

A Control représente un comportement qui est skinnable (templatable), tandis qu'un UserControl est généralement une agrégation de niveau supérieur de Control s qui est spécifique à une application.

Plus d'infos disponibles here.

+3

C'est l'un des liens que j'ai trouvé qui n'expliquait pas très bien les choses :). Je pense qu'une chose qui me manque est ce que skinnable/templatable signifie vraiment et pourquoi cela ne peut pas être fait avec un contrôle utilisateur. En outre, la dernière phrase de l'article lié est "Généralement et en termes simples, les contrôles personnalisés ont une meilleure flexibilité et réutilisabilité que les contrôles utilisateur". Si c'est vrai, alors pourquoi voudrais-je jamais créer un contrôle utilisateur? –

Questions connexes