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):
ControlTemplatekullanımContentPresenterControlTemplate( DataTemplateşablonlar dahil ve hariç) bunlardan herhangi birini kullanmamaya çalışın, ihtiyacınız varsa, tercih etmelisinizContentPresenterContentControlİç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 Contentbelirtmeye 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 ControlTemplatebaşka bir kapsayıcısında isterseniz, içine ContentControlve 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 ControlTemplateveControlPresentersiç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.
Buttonetmez 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 ContentControlde sadece de kullanılamadı ControlTemplateiçeriğini görüntülemek için Button. Bu nedenle, soruya cevap vermez.