Quelle est la différence entre ContentControl et ContentPresenter?
-
18-09-2019 - |
Question
Je ne sais pas quand je devrais utiliser ContentPresenter
au lieu de ContentControl
(et vice-versa). En ce moment, j'utilise ContentControl
à peu près tout le temps dans mes DataTemplate
s. Quand serait ContentPresenter
un meilleur choix? et pourquoi?
La solution
ContentControl
est une classe de base des contrôles qui contiennent d'autres éléments et qui ont une Content
-propriété (par exemple, Button
).
ContentPresenter
est utilisé à l'intérieur des modèles de contrôle pour afficher le contenu.
ContentControl
, lorsqu'il est utilisé directement (il est censé être utilisé comme une classe de base), a un modèle de contrôle qui utilise ContentPresenter pour afficher son contenu.
Mes règles empiriques (non applicable dans tous les cas, utilisez votre jugement):
- A l'intérieur
ControlTemplate
utilisationContentPresenter
- En dehors de
ControlTemplate
(y comprisDataTemplate
et modèles à l'extérieur), essayez de ne pas utiliser l'un d'eux, si vous avez besoin, vous devez préférerContentPresenter
-
ContentControl
sous-catégorie si vous créez une coutume « lookless » contrôler que le contenu d'accueil et vous ne pouvez pas obtenir le même résultat en changeant le modèle d'un contrôle existant (qui devrait être extrêmement rare).
Autres conseils
ContentPresenter est généralement utilisé dans un ControlTemplate, comme un espace réservé pour dire « mettre le contenu réel ici ».
A ContentControl peut être utilisé partout, pas nécessairement dans un modèle. Il ramassera tout DataTemplate défini pour le type de contenu qui lui est attribué
J'ai récemment écrit un post sur mon blog au sujet de ces deux contrôles:
ContentPresenter vs ContentControl de (EDIT:. lien brisé remplacé par la version archivée)
ContentPresenter.ContentSource est ce qui fait en fait la plus grande différence entre les deux classes.
propriété ContentSource n'a de sens que dans un ControlTemplate; il détermine la propriété TemplatedParent le contenu doit être mis en correspondance avec.
Par exemple, si un contrôle contient une MyProperty1
de propriété de dépendance, nous pourrions trouver ce qui suit dans son ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Le contenu du ContentPresenter recevra la valeur de MyProperty1
.
S'il vous plaît noter que si le nom de la propriété est Content
, il n'y a pas besoin de préciser ContentSource
car il est la valeur par défaut.
Pour ceux qui connaissent AngularJS. Ceci est similaire à transclude mécanisme
Parfois, un exemple est plus facile que le jargon théorique. Dans un site Web MS (Faites défiler vers le bas: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v = vs.110) .aspx ), il utilise un bouton, par exemple, . Un bouton a une ContentControl, qui vous permet de placer une commande ou un contrôle personnalisé qui pourrait être une image, texte, CheckBox, StackPanel, Grille, peu importe.
Après la personnalisation de Button, maintenant sur le XAML, vous pouvez écrire
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Dans le code exemple ci-dessus, le "mon: Button.Content" est le ContentControl. Le AnotherControl sera lieu à ce que vous aviez indiqué où le ContentPresenter est.
De même, lorsque compare TextBox et TextBlock, TextBox a une ContentPresenter pour vous farcir des choses dans ce comme l'exemple de bouton ci-dessus alors qu'un TextBlock ne fonctionne pas. Un TextBlock ne vous permet d'entrer du texte.
Son une vieille question, mais je venais de terminer l'élaboration d'un contrôle de carreaux d'animation, modèle basé pour une application universelle, regardez ce code de l'ancien téléphone WP7 / 8 SDK:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Vous pouvez voir ici ContentControl est le conteneur et le présentateur pour afficher le contenu. Dans la plupart des cas, le ControlTemplate sera le conteneur, mais si vous voulez dans votre ControlTemplate
un autre récipient, vous pouvez mettre un conteneur supplémentaire: ContentControl
en elle et pour présenter le contenu d'une ContentPresenter
séparée. Si vous ne avez pas besoin d'un récipient séparé puis il suffit d'utiliser ControlTemplate
et ControlPresenters
pour afficher des blocs de contenu au moins thats ce que les gars de Microsoft ont fait quand ils ont développé le WP7 / 8 SDK. Le ContentControl peut également être utilisé pour afficher le contenu, mais il sert à la fois comme conteneur et présentateur. Ainsi, dans l'exemple de code ci-dessus son but splitted dans le conteneur et présentateur. Dans les échantillons dynamiques, vous pouvez afficher le conteneur (il peut avoir un fond vide ou quelque chose thats pas encore là), puis remplir dynamiquement le contenu du présentateur. Un conteneur a des dimensions (largeur, hauteur, etc.), vous mettez ces propriétés sur le contrôle des conteneurs et du présent contenu sur elle. Dans l'exemple ContentControl détermine ce qui doit être fait avec le contenu du présentateur.