Відповіді:
ContentControl
є базовим класом для елементів керування, які містять інші елементи та мають Content
-властивість (наприклад, Button
).
ContentPresenter
використовується у шаблонах управління для відображення вмісту.
ContentControl
, при використанні безпосередньо (він повинен використовуватися як базовий клас) має шаблон управління, який використовує ContentPresenter для відображення його вмісту.
Мої правила (не застосовується в кожному випадку, використовуйте ваше судження):
ControlTemplate
використанняContentPresenter
ControlTemplate
(включаючи DataTemplate
шаблони і за їх межами) намагайтеся не використовувати жоден із них, якщо вам потрібно, ви повинні віддати перевагуContentPresenter
ContentControl
якщо ви створюєте нестандартний контроль за вмістом хосту, і ви не можете отримати той самий результат, змінивши існуючий шаблон управління (це має бути вкрай рідко).ContentPresenter зазвичай використовується в ControlTemplate, як заповнювач, щоб сказати "помістити фактичний вміст сюди".
ContentControl можна використовувати будь-де, не обов'язково в шаблоні. Він підбере будь-який шаблон DataTemplate, визначений для типу призначеного йому вмісту
Нещодавно я написав пост у своєму блозі щодо цих двох елементів контролю:
ContentPresenter vs ContentControl (EDIT: Несправне посилання замінено на архівну версію.)
ContentPresenter.ContentSource є те , що на насправді робить велику різницю між цими двома класами. Властивість ContentSource має сенс лише у ControlTemplate; він визначає, з якою властивістю TemplatedParent вміст повинен бути відображений. Наприклад, якщо елемент керування містить властивість залежності MyProperty1
, то ми можемо виявити таке в його межах ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Вміст ContentPresenter отримає значення MyProperty1
.
Зауважте, що якщо назва ресурсу є Content
, вказувати не потрібно, ContentSource
оскільки це значення за замовчуванням.
Для тих, хто знає angularJs: це схоже на переключення меканізму.
Це старе питання, але я тільки закінчував розробку анімованого керування плиткою, шаблону для універсальної програми, дивіться на цей код зі старого SDK телефону WP7 / 8:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Тут ви можете побачити, що ContentControl є контейнером і презентатором для відображення вмісту. У більшості випадків ControlTemplate буде контейнером, але якщо ви хочете в ControlTemplate
інший контейнер, ви можете помістити додатковий контейнер: ContentControl
в нього і для подання вмісту окремим ContentPresenter
. Якщо вам не потрібен окремий контейнер, просто використовуйте ControlTemplate
іControlPresenters
щоб відображати блоки вмісту, принаймні, те, що робили хлопці в Microsoft, коли розробляли SDK WP7 / 8. ContentControl також може використовуватися для відображення вмісту, але тоді він служить як контейнером, так і презентатором. Тож у зразковому коді вище його призначення розбито на контейнери та презентатори. У динамічних зразках ви можете відобразити контейнер (він може мати порожній фон або щось ще немає), а потім динамічно заповнити його вмістом презентатора. Контейнер має розміри (ширина, висота тощо), ви ставите ці властивості на елемент управління контейнером і представляєте вміст на ньому. У зразку ContentControl визначає, що потрібно робити зі змістом презентатора.
Іноді приклад легший, ніж теоретичний жаргон. На веб-сайті MS (Прокрутіть донизу: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ) він використовує кнопку як приклад. Кнопка має ContentControl, який дозволяє розмістити один елемент управління або спеціальний елемент керування, який може бути зображенням, текстом, контрольною книжкою, StackPanel, сіткою і будь-яким іншим.
Після налаштування кнопки, тепер на Xaml, ви можете писати
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
У наведеному вище прикладі коду "my: Button.Content" - це ContentControl. ІншийControl розмістить те, що ви вказали, де знаходиться ContentPresenter.
Аналогічно, якщо порівнювати TextBox та TextBlock, TextBox має ContentPresenter для того, щоб ви вміщували в нього речі, як у наведеному вище прикладі Кнопки, тоді як TextBlock - ні. TextBlock дозволяє лише вводити текст.
Button
не має [ ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), він є (успадковується від) ContentControl
. Button
МаєContentPresenter
. Зауважте, що ви можете це робити зі стандартом Button
, не потрібно його налаштовувати.
ContentPresenter
, A ContentControl
не можна було б використовувати так само добре, ControlTemplate
щоб відобразити вміст Button
. Як такий, він не відповідає на питання.