Quelle est la différence entre une bibliothèque de contrôles utilisateur et une bibliothèque de contrôles personnalisés?

168

Je viens juste de me mettre au courant de WPF et je voudrais créer un contrôle WPF réutilisable.

Lorsque je regarde les options de création de projets dans Visual Studio, je vois «WPF User Control Library» et «WPF Custom Control Library». Je ne sais pas quelle est la différence entre eux et mes recherches sur Google n'ont donné aucune explication décente.

J'aimerais comprendre les différences entre eux et, idéalement, voir quelques exemples d'utilisation de l'un par rapport à l'autre.

17 sur 26
la source
2
N'oubliez pas d'imbriquer le contenu ou de modifier le modèle d'un contrôle en tant qu'options. Vous pouvez apporter des modifications assez spectaculaires à un contrôle de cette façon sans avoir à écrire un contrôle personnalisé.
MichaC
Juste ce que MichaC a dit. La meilleure partie de WPF est que la création de modèles de contrôles existants peut avoir un impact énorme. Vous devriez rarement exiger des contrôles personnalisés. Ceci est différent de WinForms où même des modifications mineures d'un contrôle nécessitaient un nouveau contrôle dérivé.
Mikko Rantanen
Toujours utile. Ayez un autre badge en or.
ouflak

Réponses:

117

En pratique, les contrôles personnalisés sont quelque chose que vous implémentez au niveau du code tandis 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 il est généralement étendu en plaçant d'autres contrôles à l'intérieur. Ainsi, comme Kent l'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. Lorsque vous créez une application et y placez un UserControl, l'arborescence de contrôle contiendra 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' <UserControl>élément. Lorsque vous utilisez un contrôle personnalisé, vous dérivez probablement le contrôle lui-même à partir d'un bouton. La différence serait visible dans l'arborescence logique.

Alors que le contrôle personnalisé fournirait une arborescence logique similaire à

  • La fenêtre
    • CustomButton

Le UserControl donnerait un arbre logique de

  • La fenêtre
    • CustomButtonUserControl
      • Bouton

Donc, en fin de compte, UserControl n'est qu'un ContentControl normal que vous pouvez étendre 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é de mise en œuvre car vous devez faire toute la logique et l'interaction dans le code au lieu de bénéficier de XAML.

Bien qu'après tout cela, je ne pense pas qu'il y ait autant de différence dans les modèles Visual Studio. Très probablement, le contrôle personnalisé Visual Studio crée simplement un projet avec un contrôle personnalisé vide tandis que le projet de contrôle utilisateur est un projet avec un contrôle utilisateur vide. Vous pouvez ultérieurement ajouter n'importe quel type d'éléments au projet.

Mettre à jour

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

Mikko Rantanen
la source
2
Un contrôle personnalisé peut-il être utilisé pour agréger d'autres contrôles?
17 du 26
Et qu'en est-il du problème des skinnables / modèles?
17 du 26
1
Je ne sais pas 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 cependant 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é (je ne sais pas si vous pouvez le faire avec un contrôle utilisateur).
Mikko Rantanen
Oui, mais si vous souhaitez simplement agréger d'autres contrôles, ce serait probablement beaucoup plus facile à faire avec un contrôle utilisateur. En fonction de ce que vous voulez faire, un contrôle personnalisé peut être très difficile à écrire, c'est pourquoi vous choisirez d'utiliser un contrôle utilisateur même s'il ne fournit qu'un sous-ensemble des fonctionnalités.
MichaC
1
Ces deux contrôles doivent être personnalisables / modélisables lorsqu'ils sont mis en œuvre correctement. Malheureusement, ma référence WPF est actuellement au bureau, je ne peux donc pas vérifier les détails de la mise en œuvre.
Mikko Rantanen
23

A Controlreprésente un comportement skinnable (modélisable), alors que a UserControlest généralement une agrégation de niveau supérieur de Controls qui est spécifique à une application.

Plus d'informations disponibles ici .

Kent Boogaart
la source
3
C'est l'un des liens que j'ai trouvé qui n'expliquait pas très bien les choses :). Je suppose qu'une chose qui me manque, c'est ce que signifie réellement skinnable / templatable et pourquoi cela ne peut pas être fait avec un contrôle utilisateur. En outre, la dernière phrase de l'article lié est "D'une manière générale et simple, les contrôles personnalisés ont une meilleure flexibilité et réutilisabilité que les contrôles utilisateur". Si tel est le cas, pourquoi voudrais-je créer un contrôle utilisateur?
17 du 26