Ich bin mir nicht sicher, wann ich ContentPresenter
anstelle von ContentControl
(und umgekehrt) verwenden sollte. Im Moment verwende ich ContentControl
so ziemlich die ganze Zeit in meinem DataTemplate
s. Wann wäre ContentPresenter
eine bessere Wahl? und warum?Was ist der Unterschied zwischen ContentControl und ContentPresenter?
Antwort
ContentControl
ist eine Basisklasse für Kontrollen, die andere Elemente enthalten und eine Content
-Property (beispielsweise Button
).
ContentPresenter
wird in Steuerelementvorlagen verwendet, um Inhalt anzuzeigen.
ContentControl
, wenn direkt verwendet (es soll als Basisklasse verwendet werden), hat eine Steuerelementvorlage, die ContentPresenter verwendet, um seinen Inhalt anzuzeigen.
EDIT: Meine Faustregeln (nicht anwendbar in jedem Fall, verwenden Sie Ihr Urteil):
- Innen
ControlTemplate
VerwendungContentPresenter
- Außerhalb
ControlTemplate
(einschließlichDataTemplate
und außerhalb Vorlagen) versuchen, nicht zu verwenden, von ihnen, wenn Sie benötigen, müssen SieContentPresenter
- Unterklasse
ContentControl
Wenn Sie ein benutzerdefiniertes "lookless" Steuerelement, dass Host-Inhalt erstellen und Sie können nicht das gleiche Ergebnis erhalten, indem Sie die Vorlage eines vorhandenen Steuerelements (das sollte extrem selten sein).
ContentPresenter wird normalerweise in einem ControlTemplate als Platzhalter verwendet, um "den tatsächlichen Inhalt hier zu setzen".
Ein ContentControl kann überall verwendet werden, nicht unbedingt in einer Vorlage. Es wird jede Datatemplate definiert für die Art des Inhalts, um es abholen zugeordnet
Würde ein ContentPresenter nicht auch dazu führen, dass ein DataTemplate auf seinen Inhalt angewendet wird? Ist das nicht einer seiner Hauptzwecke? –
mmm ... ja, wahrscheinlich. Wie auch immer, Bea Stollnitz's Erklärung ist viel besser als meine;) –
Ich schrieb vor kurzem einen Beitrag auf meinem Blog in Bezug auf diese beiden Kontrollen:
ContentPresenter vs ContentControl (EDIT:. Unterbrochene Verbindung mit archivierten Version ersetzt)
Die ContentPresenter.ContentSource ist, was das eigentlich macht größter Unterschied zwischen den beiden Klassen. ContentSource-Eigenschaft ist nur innerhalb einer ControlTemplate sinnvoll; Sie bestimmt, mit welcher TemplatedParent-Eigenschaft der Inhalt zugeordnet werden soll. den Wert von MyProperty1
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Der Inhalt des Content erhalten: Zum Beispiel, wenn ein Steuer einer Abhängigkeitseigenschaft MyProperty1
enthält, dann könnten wir folgende in seinem ControlTemplate
finden.
Wenn der Name der Eigenschaft Content
lautet, muss ContentSource
nicht angegeben werden, da dies der Standardwert ist.
Für diejenigen, die AngularJs kennen: Dies ist ähnlich zu Mecanism Transclude.
Manchmal ist ein Beispiel einfacher als theoretischer Jargon. Auf einer MS-Website (Scroll to the bottom: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx) wird eine Schaltfläche als Beispiel verwendet.Eine Schaltfläche verfügt über ein ContentControl, mit dem Sie ein Steuerelement oder ein benutzerdefiniertes Steuerelement platzieren können, z. B. Image, Text, CheckBox, StackPanel, Grid, was auch immer.
Nach der Anpassung von Buttons können nun auf der XAML Sie
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Im obigen Beispiel Code schreiben, der „meine: Button.Content“ die Content ist. Das AnotherControl wird an die Stelle gesetzt, an der Sie den ContentPresenter angegeben haben.
Ähnlich, wenn TextBox und TextBlock verglichen werden, hat TextBox einen ContentPresenter für Sie, um Sachen wie im obigen Button-Beispiel zu stopfen, während ein TextBlock nicht. Ein TextBlock erlaubt nur die Eingabe von Text.
A ['Button'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.button%28v=vs.110%29.aspx) hat * a [' ContentControl '] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), es * ist ein * (erbt von) 'ContentControl'. Der 'Button' * hat * einen [' ContentPresenter'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter%28v=vs.110%29.aspx). Beachten Sie, dass Sie dies mit dem Standard "Button" tun können, ohne es anpassen zu müssen. –
Aber unabhängig davon erklärt diese Antwort nicht, ob und warum anstelle des 'ContentPresenter' ein' ContentControl' nicht so gut in der 'ControlTemplate' verwendet werden könnte, um den Inhalt des' Button' anzuzeigen. Als solche beantwortet es die Frage nicht. –
Seine eine alte Frage, aber ich gerade fertig war ein animiertes Tile Kontrolle der Entwicklung, Vorlage für eine Universal-App basiert, betrachten Sie diesen Code aus dem alten Telefon WP7/8 SDK:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Hier können Sie sehen, Das ContentControl ist der Container und der Presenter zum Anzeigen von Inhalten. In den meisten Fällen ist das ControlTemplate der Container, aber wenn Sie in Ihrem ControlTemplate
einen anderen Container möchten, können Sie einen zusätzlichen Container hinzufügen: ContentControl
darin und für die Präsentation des Inhalts eine separate ContentPresenter
. Wenn Sie keinen separaten Container benötigen, verwenden Sie einfach ControlTemplate
und ControlPresenters
für die Anzeige von Inhaltsblöcken, zumindest was die Jungs von Microsoft bei der Entwicklung des WP7/8 SDK getan haben. Das ContentControl kann auch zum Anzeigen von Inhalten verwendet werden, dient dann aber sowohl als Container als auch als Moderator. Im obigen Beispielcode ist der Zweck in Container und Presenter aufgeteilt. In dynamischen Beispielen können Sie den Container anzeigen (er kann einen leeren Hintergrund haben oder etwas, das noch nicht vorhanden ist) und ihn dann dynamisch mit dem Inhalt des Referenten füllen. Ein Container hat Dimensionen (Breite, Höhe usw.), Sie legen diese Eigenschaften auf dem Container-Steuerelement fest und zeigen Inhalte darauf an. Im Beispiel bestimmt das ContentControl, was mit dem Moderatorinhalt gemacht werden muss.
Bedeutet das, dass ich im Allgemeinen ContentPresenter in meinen DataTemplates verwenden sollte, weil es leichter ist (aber funktionell äquivalent, wenn es in einem DataTemplate wie diesem verwendet wird)? Dann benutze einfach ContentControl als Basisklasse, wenn ich ein neues Steuerelement schreibe? – Wilka
Ich habe die Antwort mit mehr Details bearbeitet, wenn ich ContentPresenter verwenden würde und wenn ContentControl – Nir
Ok habe ich Idee, dass ContentPresenter in Vorlagen anstelle von ContentControl verwendet werden sollte, aber warum? – sll