Frage

Ich bin mir nicht sicher, wann ich es verwenden soll ContentPresenter anstatt ContentControl (und umgekehrt).Im Moment verwende ich ContentControl so ziemlich die ganze Zeit in meinem DataTemplateS.wann würde ContentPresenter eine bessere Wahl sein?und warum?

War es hilfreich?

Lösung

ContentControl ist eine Basisklasse für Steuerelemente, die anderen Elemente enthalten und eine Content-Eigenschaft (zum Beispiel Button).

ContentPresenter innerhalb Steuerungsschablonen verwendet, um Inhalte anzuzeigen.

ContentControl, wenn sie direkt verwendet (es angenommen hat, als Basisklasse verwendet werden), eine Steuervorlage hat die Content verwendet es ist Inhalt angezeigt werden soll.

Meine Faustregeln (nicht anwendbar in jedem Fall, verwenden Sie Ihr Urteil):

  1. Innerhalb ControlTemplate Verwendung ContentPresenter
  2. Außerhalb ControlTemplate (einschließlich DataTemplate und außerhalb Vorlagen) nicht versuchen, einen von ihnen zu verwenden, wenn Sie möchten, müssen Sie ContentPresenter bevorzugen
  3. Subclass ContentControl wenn Sie eine benutzerdefinierte „lookless“, dass die Host-Inhalte steuern, erstellen und Sie können nicht das gleiche Ergebnis durch eine bestehende Steuerung der Vorlage zu ändern (das sollte extrem selten sein).

Andere Tipps

Content in der Regel in einem Control verwendet wird, als Platzhalter zu sagen, „den tatsächlichen Inhalt hier setzen“.

Ein Content kann überall sein, die nicht unbedingt in einer Vorlage verwendet. Es wird jede Datatemplate definiert für die Art von Inhalten zugeordnet aufheben

Ich habe kürzlich in meinem Blog einen Beitrag zu diesen beiden Steuerelementen geschrieben:

ContentPresenter vs. ContentControl (BEARBEITEN:Defekter Link durch archivierte Version ersetzt.)

Der ContentPresenter.ContentSource ist es, was tatsächlich den größten Unterschied zwischen den beiden Klassen ausmacht.Die ContentSource-Eigenschaft ist nur innerhalb einer ControlTemplate sinnvoll.Es bestimmt, welcher TemplatedParent-Eigenschaft der Inhalt zugeordnet werden soll.Wenn beispielsweise ein Steuerelement eine Abhängigkeitseigenschaft enthält MyProperty1, dann könnten wir darin Folgendes finden ControlTemplate:

<ControlTemplate TargetType="MyControl" >
    [...]
       <ContentPresenter ContentSource="MyProperty1" />
    [...]
</ControlTemplate>

Der Inhalt des ContentPresenter erhält den Wert von MyProperty1.

Bitte beachten Sie, dass der Name der Unterkunft lautet Content, eine Angabe ist nicht erforderlich ContentSource da es der Standardwert ist.

Für diejenigen, die AngularJs kennen:Dies ähnelt dem Transklusion-Mechanismus.

Manchmal ist ein Beispiel einfacher als theoretischer Jargon. In einer MS-Website (Scrollen Sie nach unten: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v = vs.110) ASPX- ), verwendet er einen Knopf als Beispiel . A-Knopf hat einen Content, mit dem Sie eine Kontrolle oder eine benutzerdefinierte Kontrolle stellen ermöglicht, dass ein Bild, Text, CheckBox, Stackpanel, Gitter, was sein könnte.

Nach der Anpassung von Buttons, jetzt auf der XAML, können Sie schreiben

<my:Button>
   <my:Button.Content>
      <my:AnotherControl>
   </my:Button.Content>
</my:Button>

Im obigen Beispiel-Code, der „mein: Button.Content“ ist der Content. Die AnotherControl wird Platz, was Sie angegeben hatte, wo die Content ist.

Und wenn TextBox und TextBlock- vergleicht, hat TextBox ein Content für Sie Sachen wie der Knopf oben Beispiel darin zu stopfen, während ein Textblock nicht. Ein Textblock nur ermöglicht es Ihnen, Text einzugeben.

Die eine alte Frage, aber ich fertig war nur eine animiertes Tile Kontrolle zu entwickeln, Vorlage für einen 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, die Content der Container und der Moderator für den Inhalt anzuzeigen. In den meisten Fällen wird die Control der Container sein, aber wenn Sie in Ihrem ControlTemplate einen anderen Container möchten, können Sie einen zusätzlichen Container setzen: ContentControl in ihm und für den Inhalt einen separaten ContentPresenter präsentiert. Wenn Sie einen separaten Behälter nicht brauchen dann benutzen Sie einfach ControlTemplate und ControlPresenters zum Anzeigen von Inhaltsblöcken zumindest das ist, was die Jungs von Microsoft getan haben, als sie den WP7 / 8 SDK entwickelt. Die Content kann auch für die Anzeige von Inhalten verwendet werden, aber dann dient es sowohl als Container und Moderator. So in dem Beispielcode über seinen Zweck wird in Container und Presenter gespaltet. In dynamischen Proben können Sie die Container angezeigt (es kann einen leeren Hintergrund hat oder etwas, das noch nicht da) und dann dynamisch mit dem Moderator Inhalt füllen. Ein Behälter hat Abmessungen (Breite, Höhe etc.), man diese Eigenschaften auf der Behältersteuerung und gegenwärtigen Inhalt auf sich. In der Probe bestimmt die Content was mit dem Moderator Inhalt getan werden muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top