40 votes

WPF ControlTemplate vs UserControl

J'ai récemment fait un UserControl, qui a pris un temps assez long, parce que j'ai eu à travailler avec des Propriétés de Dépendance personnalisées et ainsi de suite...

De toute façon, c'était juste un tas de 3 contrôles: zone de texte, une Popup avec un Arbre Hiérarchique.

Maintenant, j'ai réalisé que je pourrais probablement écrire un ControlTemplate seulement. Par conséquent, ce qui est l' avantage de l'utilisation de UserControl?

58voto

Kenan E. K. Points 8497

Il y a trois cas à considérer ici: UserControl, ControlTemplate, et la coutume de Contrôle. (Je devine un DataTemplate a besoin d'aucune explication)

Un Contrôle personnalisé est quelque chose que vous fournissez lors de la création de la base de la fonctionnalité d'un nouveau composant de l'INTERFACE utilisateur. Il ya divers avantages et inconvénients, mais par exemple, si vous souhaitez sélection personnalisée comportement d'un ItemsControl, vous pourriez mieux faire par la sous-classement Sélecteur ou MultiSelector (le wpftoolkit DataGrid n'est présent). Aussi, si vous voulez un objet contenant une nouvelle DependencyProperty, vous aurez dans la plupart des cas dériver de Contrôle.

Wpf principe énoncé ici est le "lookless" paradigme de contrôle, ou "assurez-vous de demander à quelqu'un de template de votre Contrôle, ou au moins faire en sorte qu'il se comporte correctement dans votre propre modèle de scénario". Contrôles personnalisés sont généralement créés avec la possibilité de réutilisation à l'esprit, souvent en tant que parties de cadre dll.

Un ControlTemplate est essentiellement une description d'un remplacement de l'arbre visuel, et peut être définie de façon explicite sur FrameworkElements, ou comme une partie d'un Style. C'est l'option que vous devriez viser à quand votre objectif est principalement de faire une demande et être fait avec elle. Vous pouvez faire presque n'importe quoi avec un ControlTemplate visuellement, si vous êtes en mesure d'obtenir les liaisons et les déclencheurs (et la possible contenant le Style lui-même) à droite. Tout cela peut être déclarée comme une ressource d'un réutilisés, pour donner à votre application, une commune "thème".

Un UserControl est lui-même un contrôle composite, avec les pièces individuellement modifiable dans le concepteur, et est mieux utilisé si vous avez besoin de voir vos composants et de les gérer dans le concepteur. Un ControlTemplate, d'autre part, ne sera pas exposer ses composants pour la manipulation dans le concepteur (bien qu'il sera visible). Vous avez l'habitude de créer un UserControl pour une page de détails du Client, ou d'un Produit d'affichage du navigateur, ou en tout cas où vous ne souhaitez pas créer un Contrôle complet, mais vous voulez la vue détaillée avec la pleine prise en charge du concepteur.

Un cas particulier ici est que si vous utilisez le MVVM modèle. De nombreux grands MVVM implémentations utilisent UserControls que des Vues, et ControlTemplates et les Styles que les ressources utilisées par ces points de vue. MVVM pratique permet également de réduire le besoin pour un Contrôle personnalisé, et a beaucoup d'autres avantages.

(Pour plus d'informations sur MVVM, parmi beaucoup d'autres, Google pour Josh Smith, Sacha salon de coiffure et Karl Shifflett de fantastiques articles)

3voto

Drew Noakes Points 69288

Si vous ajoutez vos propres propriétés de dépendance, alors vous aurez besoin de votre propre classe pour les définir.

Que vous souhaitez appliquer un modèle de la classe, cette classe personnalisée va dériver de Control (en tant que UserControl t).

Le principal avantage de l'écriture de votre propre Control-classe dérivée, c'est qu'il peut avoir son modèle redéfini pour d'autres scénarios d'utilisation, par vous-même à l'intérieur de l'application, ou par d'autres utilisateurs de ce type.

Il y a très peu de surcharge dans l'utilisation de l' UserControl classe. En fait, si vous regardez dans Reflector.NET vous verrez qu'il n'a presque plus de code. Principalement, UserControl seulement redéfinit les métadonnées sur certaines propriétés de dépendance (par exemple, la valeur par défaut de FocusableProperty false.)

Sauf si vous avez besoin de redéfinir le modèle de la commande immédiatement, vous pouvez le laisser en tant que UserControl pour le présent et pour le changer par la suite si nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X