2009-06-08 10 views
1

Je suis nouveau sur WPF et je doute de la possibilité de modifier un contrôle. Je suis venu à savoir que l'on peut modifier un contrôle en changeant son Modèle de contrôle. à savoir,Quelle est la différence entre la modification d'un contrôle en modifiant le modèle de contrôle et l'ajout de sous-contrôles?

<Button> 
    <Button.Template> 
    <ControlTemplate> 
     ... 
    </ControlTemplate> 
    </Button.Template> 
</Button> 

Aussi nous pouvons modifier une commande en utilisant le modèle de contenu . à savoir,

<Button> 
    <Grid> 
    <CheckBox> 
    </CheckBox> 
    <RadioButton> 
    </RadioButton> 
    ... 
    </Grid> 
</Button> 

Quelle est la différence entre ces deux techniques. Lequel est le moyen correct de personnaliser un contrôle dans WPF. Aidez-moi à mieux comprendre cela.

Répondre

3

La principale différence entre ces deux choses est que le ControlTemplate définit l'apparence du contrôle. Il ne place pas réellement le contenu à l'intérieur de celui-ci. À un certain endroit à l'intérieur du contrôle de contenu, il devrait y avoir une forme de ContentPresenter. Les contrôles intégrés sont capables de cela parce qu'ils sont ce qui est connu comme 'lookless controls', et tous les contrôles personnalisés créés devraient également être sans apparence. Quand un contrôle n'est pas modélisé de manière anonyme, mais qu'il a une disposition statique, la confusion que vous avez rencontrée peut se produire.

Comme pour le correct façon de faire les choses, cela dépend de ce que vous essayez d'atteindre. Si vous tentez de modifier le contrôle, tel que l'apparence et le comportement, alors using a ControlTemplate (ou DataTemplate, en fonction de ce que vous êtes en train de taper) est définitivement la solution. Un bon exemple de ceci est le CheckBox, croyez-le ou non, le CheckBox est en fait un ToggleButton (more or less), que through templating affiche la togleablity dans une balle. Here's un autre très bon exemple de la façon dont vous pouvez utiliser des modèles pour faire des choses très chouettes. ControlTemplates devrait également être applied through Styles, au lieu de directement définir sur un élément

Si vous ne souhaitez pas réellement modifier le comportement ou l'apparence du contrôle, l'utilisation du modèle de contenu est la bonne approche.

WPF does this better then Silverlight, mais je ne sais pas s'il y a des améliorations dans SL3.

0

Le modèle peut être placé dans une ressource et réutilisé pour un autre bouton.

La modification directe du contenu n'est pas réutilisable, sauf si vous en créez un UserControl.

Lequel vous utilisez dépend d'une tâche concrète et de vos préférences personnelles.

+0

Le contenu d'un contrôle est très certainement réutilisable, soit en définissant l'élément en tant que ressource et en utilisant ContentControls, soit en affectant le contenu en tant que DataTemplate. – rmoore

+0

Je pense que si vous utilisez ContentControl ou DataTemplate, ce ne sera pas le même cas n ° 2 dans la question d'origine. –

1

Ma règle de base est que s'il est possible d'obtenir ce que je veux sans changer le modèle de contrôle, alors vous ne devriez pas changer le modèle de contrôle.

les modèles de contrôle sont un moyen de changer l'aspect & sentir un contrôle, par exemple en faisant un bouton rond de changement de la coche graphique d'une case à cocher.

ajouter des contrôles à l'intérieur d'un contrôle est plus simple, par exemple placer une image à l'intérieur d'un bouton.Rappelez-vous, il y a beaucoup de fonctionnalités dans le modèle de contrôle, y compris le remplissage, l'alignement du contenu, l'aspect désactivé et plus, si vous changez le modèle de contrôle, vous devrez ajouter le support pour toutes ces fonctionnalités.