Главная » WPF » Элемент ContentPresenter

0

ContentPresenter – это рабочая лошадка модели содержимого.  Он принимает любые данные, помещенные  в свойство  Content и создает  соответствующее  им дерево визуального отображения. Например, ContentPresenter  можно использо# вать для вывода числа, даты и времени или кнопки:

public Window1() {

StackPanel panel = new StackPanel();

ContentPresenter intPresenter = new ContentPresenter(); intPresenter.Content = 5; panel.Children.Add(intPresenter);

ContentPresenter datePresenter = new ContentPresenter(); datePresenter.Content = DateTime.Now; panel.Children.Add(datePresenter);

ContentPresenter elementPresenter = new ContentPresenter(); elementPresenter.Content = new Button(); panel.Children.Add(elementPresenter);

Content = panel;

}

Эта программа выводит данные разных типов, как показано на рис. 3.4.

Возникает  вопрос; «Как это делается?» Некоторые подсказки  дает объектная модель ContentPresenter:

public class ContentPresenter : FrameworkElement {

public object Content { get; set; }

public string ContentSource { get; set; }

public DataTemplate ContentTemplate { get; set; }

public DataTemplateSelector ContentTemplateSelector { get; set; }

}

Рис. 3.4. Использование нескольких объектов ContentPresenter для вывода различных данных и соответствующее дерево отображения

Первое,  на  что  хочется  обратить  внимание  при  знакомстве   с объектом  Content Presenter, – это тип данных содержимого. Если содержимое  уже принадлежит типу System.Windows.UIElement (базовый класс всех элементов  управления), то больше ничего делать не нужно – содержимое может быть сразу же добавлено в дерево отоб# ражения. В противном случае ContentPresenter пытается найти альтернативные спо# собы преобразовать содержимое в визуальный образ, пробуя следующие варианты:

1.  Если Content принадлежит типу UIElement, добавить в дерево отображения.

2.  Если задано свойство ContentTemplate, использовать шаблон для создания экземпляра класса  UIElement, а затем добавить  этот экземпляр в дерево отображения.

3.  Если задано свойство ContentTemplateSelector, использовать его для поис# ка шаблона, затем по шаблону создать экземпляр класса UIElement и доба# вить его в дерево отображения.

4.  Если с типом данных Content ассоциирован шаблон данных1, использовать его для создания  экземпляра класса UIElement.

1  Шаблоны данных рассматриваются в главе 6.

5.  Если с типом данных Content ассоциирован объект класса TypeConverter, который  способен  преобразовать содержимое  к типу  UIElement,  выпол# нить такое преобразование и добавить результат  в дерево отображения.

6.  Если  с типом  данных  Content ассоциирован объект TypeConverter, кото# рый способен преобразовать содержимое  в строку, обернуть содержимое  в объект TextBlock  и добавить его в дерево отображения.

7.  Если больше ничего не остается, вызвать  метод ToString объекта Content, обернуть результат  в объект TextBlock  и добавить его в дерево отображе# ния.

Таблица 3.1. Схема именования свойства, в котором хранится содержимое

Количество

Объект(ы)

Элемент(ы)

Один

Content

Child

Несколько

Items

Children

Как видим, ContentPresenter прилагает  все усилия  к тому, чтобы создать неч# то, допускающее  отображение.  Единственное значение,  которое гарантированно не будет отображено, – это null; все остальное так или иначе отображается, при# чем в худшем случае будет выведен результат,  возвращаемый методом ToString объекта#содержимого.  Инкапсулировав логику представления содержимого  в простой, допускающий  композицию элемент, мы получили  возможность повтор# ного использования. Пока что мы видели, как элемент управления Button поль# зуется  объектом  ContentPresenter, чтобы реализовать простую модель програм# мирования,  не жертвуя развитым  содержимым  и композицией элементов. Суще# ствует четыре разновидности модели содержимого,  различающиеся тем, что де# лает элемент управления (например, может ли он принимать на входе любые дан# ные или только элементы?), и является ли модель одиночной  или множествен# ной. Каждая  разновидность инкапсулирована в виде  свойства,  как  показано  в табл. 3.1.

Мы  уже  видели,  как  для  отображения содержимого  применяется свойство

Content, теперь познакомимся со свойствами  Items, Child и Children.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии