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
- Di luar
ControlTemplate
(termasuk DataTemplate
dan di luar templat) cobalah untuk tidak menggunakannya, jika perlu, Anda harus memilihContentPresenter
- Subkelas
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
sumber
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 dalamnyaControlTemplate
:Konten ContentPresenter akan menerima nilai
MyProperty1
.Harap dicatat bahwa jika nama properti adalah
Content
, tidak perlu ditentukanContentSource
karena ini adalah nilai default.Bagi mereka yang tahu angular: ini mirip dengan transclude mecanism.
sumber
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:
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 terpisahContentPresenter
. Jika Anda tidak membutuhkan wadah yang terpisah maka gunakan sajaControlTemplate
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.sumber
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
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.
sumber
Button
tidak memiliki [ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), itu adalah (diturunkan dari)ContentControl
. TheButton
memiliki sebuahContentPresenter
. Perhatikan bahwa Anda dapat melakukannya dengan standarButton
, tidak perlu menyesuaikannya.ContentPresenter
, aContentControl
tidak dapat digunakan dengan baik diControlTemplate
untuk menampilkan kontenButton
. Dengan demikian, itu tidak menjawab pertanyaan.