Jawaban:
ContentControl
adalah kelas dasar untuk kontrol yang mengandung elemen lain dan memiliki Content
-properti (misalnya, Button
).
ContentPresenter
digunakan di dalam template kontrol untuk menampilkan konten.
ContentControl
, ketika digunakan secara langsung (seharusnya digunakan sebagai kelas dasar), memiliki templat kontrol yang menggunakan ContentPresenter untuk menampilkan kontennya.
Aturan praktis saya (tidak berlaku dalam setiap kasus, gunakan penilaian Anda):
ControlTemplate
Penggunaan di dalamContentPresenter
ControlTemplate
(termasuk DataTemplate
dan di luar templat) cobalah untuk tidak menggunakannya, jika perlu, Anda harus memilihContentPresenter
ContentControl
jika Anda membuat kontrol "tidak terlihat" khusus untuk konten host itu dan Anda tidak bisa mendapatkan hasil yang sama dengan mengubah templat kontrol yang ada (yang seharusnya sangat langka).ContentPresenter biasanya digunakan dalam ControlTemplate, sebagai pengganti untuk mengatakan "taruh konten aktual di sini".
ContentControl dapat digunakan di mana saja, tidak harus dalam templat. Ini akan mengambil DataTemplate apa pun yang ditentukan untuk jenis konten yang ditugaskan padanya
Baru-baru ini saya menulis posting di blog saya mengenai dua kontrol ini:
ContentPresenter vs ContentControl (EDIT: Tautan rusak diganti dengan versi yang diarsipkan.)
The ContentPresenter.ContentSource adalah apa yang sebenarnya membuat perbedaan terbesar antara dua kelas. Properti ContentSource masuk akal hanya dalam ControlTemplate; itu menentukan properti TemplatedParent mana konten harus dipetakan. Misalnya, jika kontrol berisi properti dependensi MyProperty1
, maka kami mungkin menemukan yang berikut ini di dalamnya ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Konten ContentPresenter akan menerima nilai MyProperty1
.
Harap dicatat bahwa jika nama properti adalah Content
, tidak perlu ditentukan ContentSource
karena ini adalah nilai default.
Bagi mereka yang tahu angular: ini mirip dengan transclude mecanism.
Ini pertanyaan lama tapi saya baru saja selesai mengembangkan Tile Control animasi, berbasis template untuk aplikasi universal, lihat kode ini dari Phone WP7 / 8 SDK lama:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Di sini Anda dapat melihat ContentControl adalah Container dan Presenter untuk menampilkan konten. Dalam kebanyakan kasus, ControlTemplate akan menjadi Wadah tetapi jika Anda ingin di ControlTemplate
wadah lain Anda dapat menempatkan Wadah tambahan: ContentControl
di dalamnya dan untuk menyajikan konten secara terpisah ContentPresenter
. Jika Anda tidak membutuhkan wadah yang terpisah maka gunakan saja ControlTemplate
danControlPresenters
untuk menampilkan blok konten setidaknya itulah yang dilakukan orang-orang di Microsoft ketika mereka mengembangkan WP7 / 8 SDK. ContentControl juga dapat digunakan untuk menampilkan konten, tetapi kemudian berfungsi sebagai wadah dan presenter. Jadi, dalam kode contoh di atas, tujuannya dibagi dalam Container dan Presenter. Dalam sampel dinamis, Anda dapat menampilkan wadah (dapat memiliki latar belakang kosong atau sesuatu yang belum ada di sana) dan kemudian secara dinamis mengisinya dengan konten presenter. Wadah memiliki dimensi (lebar, tinggi, dll.), Anda menempatkan properti itu di kontrol wadah dan menyajikan konten di dalamnya. Dalam sampel, ContentControl menentukan apa yang harus dilakukan dengan konten presenter.
Terkadang contoh lebih mudah daripada jargon teoretis. Dalam situs web MS (Gulir ke bawah: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ), ia menggunakan tombol sebagai sebuah contoh. Sebuah Tombol memiliki ContentControl, yang memungkinkan Anda untuk menempatkan satu kontrol atau kontrol kustom yang bisa berupa Gambar, Teks, Kotak Centang, StackPanel, Kotak, apa pun.
Setelah penyesuaian Tombol, sekarang di Xaml, Anda dapat menulis
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Dalam contoh kode di atas, "my: Button.Content" adalah ContentControl. AnotherControl akan ditempatkan pada apa yang telah Anda tentukan di mana ContentPresenter berada.
Demikian pula, ketika membandingkan TextBox dan TextBlock, TextBox memiliki ContentPresenter untuk Anda memasukkan barang-barang di dalamnya seperti contoh Tombol di atas sedangkan TextBlock tidak. TextBlock hanya memungkinkan Anda memasukkan teks.
Button
tidak memiliki [ ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), itu adalah (diturunkan dari) ContentControl
. The Button
memiliki sebuah ContentPresenter
. Perhatikan bahwa Anda dapat melakukannya dengan standar Button
, tidak perlu menyesuaikannya.
ContentPresenter
, a ContentControl
tidak dapat digunakan dengan baik di ControlTemplate
untuk menampilkan konten Button
. Dengan demikian, itu tidak menjawab pertanyaan.