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 DataTemplates. Quand serait ContentPresenter un meilleur choix? et pourquoi?

Était-ce utile?

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):

  1. A l'intérieur ControlTemplate utilisation ContentPresenter
  2. En dehors de ControlTemplate (y compris DataTemplate et modèles à l'extérieur), essayez de ne pas utiliser l'un d'eux, si vous avez besoin, vous devez préférer ContentPresenter
  3. 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é

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top