Yanıtlar:
ContentControl
, diğer öğeleri içeren ve Content
-property (örneğin Button
) içeren denetimler için bir temel sınıftır .
ContentPresenter
içeriği görüntülemek için kontrol şablonlarının içinde kullanılır.
ContentControl
, doğrudan kullanıldığında (temel sınıf olarak kullanılması gerekiyor), içeriğini görüntülemek için ContentPresenter kullanan bir kontrol şablonuna sahiptir.
Temel kurallarım (her durumda geçerli değildir, kararınızı kullanın):
ControlTemplate
kullanımContentPresenter
ControlTemplate
( DataTemplate
şablonlar dahil ve hariç) bunlardan herhangi birini kullanmamaya çalışın, ihtiyacınız varsa, tercih etmelisinizContentPresenter
ContentControl
İçeriği barındıran özel bir "görünmez" denetim oluşturuyorsanız ve mevcut bir denetimin şablonunu değiştirerek aynı sonucu elde edemezseniz (çok nadir olması gerekir) alt sınıf .ContentPresenter genellikle bir ControlTemplate içinde "gerçek içeriği buraya koy" demek için bir yer tutucu olarak kullanılır.
Bir ContentControl, bir şablonda değil, her yerde kullanılabilir. Kendisine atanan içerik türü için tanımlanan herhangi bir DataTemplate'i alır
Kısa bir süre önce blogumda şu iki kontrolle ilgili bir yazı yazdım:
ContentPresenter ve ContentControl (EDIT: Bozuk bağlantı, arşivlenmiş sürümle değiştirildi.)
ContentPresenter.ContentSource aslında iki sınıf arasındaki en büyük fark yaratır şeydir. ContentSource özelliği yalnızca bir ControlTemplate içinde anlamlıdır; içeriğin hangi TemplatedParent özelliğiyle eşlenmesi gerektiğini belirler. Örneğin, bir denetim bir bağımlılık özelliği içeriyorsa MyProperty1
, bunun içinde aşağıdakileri bulabiliriz ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter içeriği değerini alır MyProperty1
.
Mülkün adı varsa , varsayılan değer olarak Content
belirtmeye gerek olmadığını lütfen unutmayın ContentSource
.
AçısalJ'leri bilenler için: bu, mekanizmi aşmaya benzer.
Bu eski bir soru ama ben sadece evrensel bir uygulama için dayalı bir animasyonlu Çini Kontrol, şablon geliştirme bitirme, eski Telefon WP7 / 8 SDK bu koda bakmak:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Burada ContentControl'ün içeriği görüntülemek için Kapsayıcı ve Sunum Yaptığını görebilirsiniz. Çoğu durumda ControlTemplate Kapsayıcı olacaktır, ancak ControlTemplate
başka bir kapsayıcısında isterseniz, içine ContentControl
ve içeriği ayrı bir şekilde sunmak için fazladan bir Kap koyabilirsiniz ContentPresenter
. Eğer ayrı bir kap ihtiyacım yok o zaman sadece kullanmak ControlTemplate
veControlPresenters
içerik bloklarını görüntülemek için, en azından Microsoft'taki çocuklar WP7 / 8 SDK'yı geliştirdiklerinde yaptıkları şey. ContentControl, içeriği görüntülemek için de kullanılabilir, ancak daha sonra hem kapsayıcı hem de sunum yapan kişi olarak hizmet eder. Bu yüzden yukarıdaki örnek kodda amacı Container ve Presenter'da bölünür. Dinamik örneklerde kapsayıcıyı görüntüleyebilir (boş bir arka planı veya henüz orada olmayan bir şey olabilir) ve ardından dinamik olarak sunum yapan kişi içeriği ile doldurabilirsiniz. Bir kabın boyutları (genişlik, yükseklik vb.) Vardır, bu özellikleri kap denetimine koyar ve üzerinde içerik sunarsınız. Örnekte ContentControl, sunucu içeriğiyle ne yapılması gerektiğini belirler.
Bazen bir örnek teorik jargondan daha kolaydır. Bir MS web sitesinde (Aşağıya kaydırın: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ), Bir örnek. Bir Düğme, bir denetim veya bir Resim, Metin, CheckBox, StackPanel, Grid gibi herhangi bir özel denetim yerleştirmenize izin veren bir ContentControl'e sahiptir.
Düğmenin özelleştirilmesinden sonra, şimdi Xaml'de,
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Yukarıdaki örnek kodda, "my: Button.Content" ContentControl olduğunu. AnotherControl, ContentPresenter'ın belirttiği yere yerleştirilecektir.
Benzer şekilde, TextBox ve TextBlock'u karşılaştırdığınızda, TextBox, yukarıdaki Button örneğinde olduğu gibi bir şey doldurmanız için bir ContentPresenter'a sahipken, TextBlock bunu yapmaz. Bir TextBlock yalnızca metin girmenize izin verir.
Button
etmez sahip bir [ ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), bu a, (devralır) ContentControl
. Button
Vardır bir ContentPresenter
. Bunu standartla yapabileceğinizi, Button
özelleştirmenize gerek olmadığını unutmayın.
ContentPresenter
, bir ContentControl
de sadece de kullanılamadı ControlTemplate
içeriğini görüntülemek için Button
. Bu nedenle, soruya cevap vermez.