web-dev-qa-db-fra.com

Contrôle personnalisé vs utilisateur

J'ai lu quelques explications sur la différence entre les contrôles utilisateur et personnalisés, par exemple ceci: http://www.wpftutorial.net/CustomVsUserControl.html

Je veux créer, par exemple, une composition simple d'une grille de données avec 2 comboboxes qui sont responsables de changer les valeurs des éléments de la grille de données. Je veux créer un contrôle spécifique pour cela parce que je vais l'utiliser beaucoup de fois. Je voudrais implémenter la logique derrière, puis dans l'invocation xaml, je n'ai qu'à spécifier la itemsSource.

Pour cet exemple, dois-je créer un contrôle utilisateur ou personnalisé? Puisque j'aurai des propriétés et une logique, devrais-je avoir un modèle de vue pour ce contrôle?

EDIT: Connaissez-vous des articles avec une séparation conceptuelle claire entre ces 2 options?

47
Louro

Le choix n'est pas seulement entre le contrôle utilisateur et le contrôle personnalisé, mais entre le contrôle utilisateur, le contrôle personnalisé, la personnalisation du modèle de contrôle, la personnalisation du modèle de données, le modèle d'en-tête (pour les contrôles basés sur la collection), les propriétés attachées. Reportez-vous à Présentation de la création de contrôle

Je passe par ordre de considération

  1. Propriétés attachées : Si la fonctionnalité peut être atteinte, j'utilise des propriétés attachées. Exemple, zone de texte numérique.

  2. Modèle de contrôle : Lorsque l'exigence peut être satisfaite en personnalisant le modèle de contrôle, je l'utilise. Exemple, barre de progression circulaire.

  3. Contrôle personnalisé : Si le modèle de contrôle ne peut pas le faire, j'utilise un contrôle personnalisé. Pourvu que je doive personnaliser/étendre le contrôle déjà présent. Exemple fournissant le tri, le filtrage basé sur la ligne d'en-tête dans GridView (GridView est présent dans les applications de métro, utilisé juste pour illustrer l'exemple)

  4. Contrôle utilisateur : le moins préféré. Uniquement lorsque la composition est requise et que je ne peux pas le faire à l'aide d'un contrôle personnalisé. Comme dans votre exemple, 2 combobox et 1 datagrid. Les contrôles utilisateur ne fournissent pas de fonctionnalité transparente et transparente qui peut être exploitée via un contrôle personnalisé ou un modèle de contrôle.

81
Tilak

Vous avez déjà d'excellentes réponses qui expliquent les différences, mais comprenez également que les contrôles personnalisés et UserControls ont des objectifs différents:

Un UserControl encapsule généralement une sorte de comportement composite. Si vous avez une application qui doit modifier les coordonnées à de nombreux endroits, par exemple, vous pouvez créer un contrôle personnalisé qui a les étiquettes et les champs de texte pour toutes les données présentées avec un bouton d'envoi qui a le code approprié et réutiliser ce contrôle tout au long de votre candidature.

Un contrôle personnalisé est un contrôle qui est dérivé de l'une des classes de contrôle WPF (E.G. Control, ContentControl etc.) et doit être créé dans le code. Ces contrôles ont généralement un seul objectif cohérent (pensez TextBox, ComboBox, Label) plutôt que d'agir ensemble dans leur ensemble (bien que cela ne soit pas nécessairement le cas). .

Les UserControl sont généralement plus faciles pour les personnes qui ne connaissent pas WPF car ils peuvent être visuellement conçus.

Ma suggestion serait de commencer avec un UserControl. Vous pouvez toujours refactoriser cela en un contrôle personnalisé à une date ultérieure à mesure que vous vous familiariserez avec le fonctionnement de WPF. La création de votre contrôle en tant que contrôle personnalisé nécessitera la connaissance de ControlTemplates et Styles car vous devrez fournir le vôtre pour définir une apparence pour votre contrôle.

En fin de compte, tant que le contrôle se comporte correctement, peu importe l'approche que vous utilisez.

Voir this post pour un exemple de deux approches au même problème. L'auteur de l'article voulait un contrôle qui puisse présenter un contenu modal devant le contenu principal. L'auteur de l'article a en fait répondu à sa propre question en l'implémentant en tant que UserControl. J'ai ajouté une réponse au message qui crée le contrôle en tant que contrôle personnalisé, mais les deux ont le même effet final.

39
Benjamin Gale

La meilleure explication se trouve dans le msdn . CustomControl est plus un nom "virtuel", il n'y a pas de classe appelée "CustomControl" dans WPF, au lieu de cela, cela signifiait créer un nouveau bâtiment de classe au-dessus d'une des classes de contrôle WPF, comme Control, ItemsControl et des contrôles encore plus spécifiques comme TextBox ou Button.

Pour votre cas spécifique, un UserControl devrait être suffisant, la création d'un CustomControl est quelque chose qui peut facilement être évité. Bien que ce ne soit pas une mauvaise chose, beaucoup de gens, en particulier les débutants en WPF venant de WinForms, ont tendance à sous-classer plus que nécessaire.

7
dowhilefor
  • Si vous avez un modèle de vue et que vous souhaitez en créer une vue, utilisez ser-Control.

  • Si vous avez besoin d'un contrôle autonome qui n'a pas de modèle de vue spécifique,
    vous avez probablement besoin d'un contrôle personnalisé.

  • Si vous trouvez que la fonctionnalité dont vous avez besoin dans son ensemble, existe déjà dans d'autres contrôles, vous devez remplacer un modèle de contrôle existant.
    (c'est-à-dire: pour un bouton en forme de diamant - vous devez remplacer le modèle de contrôle du bouton.)

  • En ce qui concerne les propriétés attachées et les comportements attachés, celles-ci sont utiles lorsque vous avez un contrôle que vous souhaitez étendre avec plus de propriétés ou que vous souhaitez qu'il se comporte légèrement différemment de son comportement par défaut.

Dans le cas prévu de la composition décrite dans l'OP, elle peut être réalisée avec un contrôle utilisateur ou un contrôle personnalisé. Je préférerais un contrôle personnalisé car il n'y a pas de modèle de vue spécifique fourni, l '"entrée" n'est qu'une propriété liée à une collection d'éléments.

Oh, et je suis désolé d'être un peu en retard.

6
G.Y

Vous pouvez facilement concevoir visuellement CustomControl. Créez un nouveau UserControl (ou une fenêtre). Créez visuellement sa structure xaml dans Designer. Copiez-collez le corps du xaml résultant dans ControlTemplate de votre nouveau CustomControl (par exemple dans un fichier de thème générique).

Si je me souviens bien, vous pouvez également concevoir visuellement le modèle CustomControl directement, dans Blend.

Bien sûr, vous pouvez également instance le wip CustomControl dans une fenêtre et placer la vue Designer de la fenêtre en tant que nouveau panneau au-dessus de la vue xaml du contrôle dans VisualStudio. Certaines liaisons xaml du modèle de style ne s'affichent pas dans Designer comme ceci, jusqu'à ce que je reconstruise.

[L'interface graphique Imho est principalement une question visuelle et ne doit pas, et n'a pas besoin d'être, créée dans le code. ]

1
Riva

Si c'est en quelque sorte votre première création de contrôles, je recommande UserControl car VS vous permet de concevoir son interface plus facilement. Les contrôles personnalisés sont plus puissants, mais vous devez clairement séparer la logique de votre contrôle de son interface et cela nécessite un peu plus de préparation.

1
NestorArturo