Odpowiedzi:
ContentControl
jest klasą bazową dla kontrolek, które zawierają inne elementy i mają Content
właściwość (na przykład Button
).
ContentPresenter
jest używany w szablonach kontrolnych do wyświetlania treści.
ContentControl
, gdy jest używany bezpośrednio (ma być używany jako klasa podstawowa), ma szablon kontrolny, który używa ContentPresenter do wyświetlania jego zawartości.
Moje ogólne zasady (nie dotyczy wszystkich przypadków, skorzystaj z własnego osądu):
ControlTemplate
Zastosowanie wewnętrzneContentPresenter
ControlTemplate
(w tym DataTemplate
i zewnętrznymi) staraj się nie używać żadnego z nich, jeśli musisz, musisz to zrobićContentPresenter
ContentControl
jeśli tworzysz niestandardową „nie wyglądającą” kontrolkę, która hostuje zawartość i nie możesz uzyskać tego samego wyniku, zmieniając szablon istniejącej kontrolki (co powinno być niezwykle rzadkie).ContentPresenter jest zwykle używany w ControlTemplate, jako symbol zastępczy, który mówi „umieść tutaj rzeczywistą treść”.
ContentControl może być używany w dowolnym miejscu, niekoniecznie w szablonie. Wybiera dowolny DataTemplate zdefiniowany dla typu przypisanej mu treści
Niedawno napisałem na moim blogu post dotyczący tych dwóch elementów sterujących:
ContentPresenter vs ContentControl (EDYCJA: Uszkodzony link zastąpiony wersją zarchiwizowaną).
ContentPresenter.ContentSource to co rzeczywiście sprawia, że największa różnica między tymi dwoma klasami. Właściwość ContentSource ma sens tylko w obrębie ControlTemplate; określa, z której właściwości TemplatedParent należy mapować treść. Na przykład, jeśli formant zawiera właściwość zależności MyProperty1
, wówczas możemy znaleźć następujące elementy ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Zawartość ContentPresenter otrzyma wartość MyProperty1
.
Należy pamiętać, że jeśli nazwa właściwości to Content
, nie trzeba jej określać, ContentSource
ponieważ jest to wartość domyślna.
Dla tych, którzy znają angularJs: jest to podobne do przełamywania mechanizmu.
To stare pytanie, ale właśnie kończyłem opracowywanie animowanego Tile Control, szablonu opartego na uniwersalnej aplikacji, spójrz na ten kod ze starego SDK telefonu WP7 / 8:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Tutaj możesz zobaczyć, że ContentControl jest kontenerem i prezenterem do wyświetlania treści. W większości przypadków ControlTemplate będzie kontenerem, ale jeśli chcesz w ControlTemplate
innym kontenerze, możesz umieścić dodatkowy kontener: ContentControl
w nim i do prezentacji zawartości osobnyContentPresenter
. Jeśli nie potrzebujesz osobnego pojemnika, po prostu użyj ControlTemplate
iControlPresenters
do wyświetlania bloków treści przynajmniej tak zrobili faceci z Microsoftu, kiedy opracowali pakiet SDK WP7 / 8. ContentControl może również służyć do wyświetlania treści, ale służy jednocześnie jako kontener i prezenter. Tak więc w powyższym przykładowym kodzie jego przeznaczenie jest podzielone na kontener i prezenter. W próbkach dynamicznych możesz wyświetlić kontener (może mieć puste tło lub coś, czego jeszcze tam nie ma), a następnie dynamicznie wypełnić go treścią prezentera. Kontener ma wymiary (szerokość, wysokość itp.), Umieszczasz te właściwości w kontrolce kontenera i wyświetlasz na nim zawartość. W przykładzie ContentControl określa, co należy zrobić z treścią prezentera.
Czasami przykład jest łatwiejszy niż teoretyczny żargon. W witrynie MS (przewiń w dół: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ) używa przycisku jako przykład. Button ma kontrolkę ContentControl, która pozwala umieścić jedną kontrolkę lub kontrolkę niestandardową, która może być obrazem, tekstem, CheckBox, StackPanel, siatką, cokolwiek.
Po dostosowaniu przycisku, teraz na Xaml, możesz pisać
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
W powyższym przykładowym kodzie „my: Button.Content” to ContentControl. AnotherControl będzie miejscem, które podałeś, gdzie jest ContentPresenter.
Podobnie, gdy porównuje się TextBox i TextBlock, TextBox ma ContentPresenter, abyś mógł w nim umieszczać rzeczy, tak jak w powyższym przykładzie przycisku, podczas gdy TextBlock nie. TextBlock pozwala tylko na wprowadzanie tekstu.
Button
nie ma [ ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), to jest (dziedziczy z) ContentControl
. Button
MaContentPresenter
. Pamiętaj, że możesz to zrobić za pomocą standardu Button
, nie musisz go dostosowywać.
ContentPresenter
a ContentControl
nie można było użyć równie dobrze w ControlTemplate
celu wyświetlenia zawartości Button
. Jako taki nie odpowiada na pytanie.