Модель содержимого WPF

Windows Presentation Foundation (WPF) — это презентационная платформа, которая предоставляет множество элементов и типов, схожих с элементами управления, основное предназначение которых — отображение различных типов содержимого. Чтобы определить, какой элемент управления использовать или от какого элемента управления выполнять наследование, вы должны понимать, какие виды объектов лучше всего может отображать конкретный элемент управления.

В этом разделе приводятся обобщенные сведения о модели содержимого для элементов управления WPF и типов, схожих с элементами управления. Модель содержимого описывает, какое содержимое может использоваться в элементе управления. Также в этом разделе перечисляются свойства содержимого для каждой модели содержимого. Свойство содержимого — это свойство, которое используется для хранения содержимого объекта.

Классы с произвольным содержимым

Некоторые элементы управления могут содержать объекты любого типа, например строку, объект DateTime или объект UIElement, являющийся контейнером для других элементов. Например, в Button может содержаться изображение и некоторый текст; или в CheckBox может содержаться значение DateTime.Now.

В WPF имеется четыре класса, которые могут иметь произвольное содержимое. В следующей таблице перечислены классы, которые наследуются от Control.

Класс с произвольным содержимым Содержание
ContentControl Один произвольный объект.
HeaderedContentControl Заголовок и один элемент, которые являются произвольными объектами.
ItemsControl Коллекция произвольных объектов.
HeaderedItemsControl Заголовок и коллекция элементов, являющиеся произвольными объектами.

Элементы управления, производные от этих классов, могут содержать тот же тип содержимого и обрабатывать содержимое аналогичным образом. На рисунке ниже показаны элементы управления из каждой модели содержимого, содержащие изображение и некоторый текст:

Screenshot that shows four different controls, one from each content model.

Элементы управления, содержащие один произвольный объект

В классе ContentControl содержится один фрагмент произвольного содержимого. Свойство содержимого у этого класса имеет значение Content. Следующие элементы управления наследуют от ContentControl и используют его модель содержимого:

На следующем рисунке показаны четыре кнопки, у которых для свойства Content заданы следующие значения: строка, объект DateTime, Rectangle, и объект Panel, который содержит объекты Ellipse и TextBlock:

Screenshot that shows four buttons with different content types.

Пример задания свойства Content см. в разделе ContentControl.

Элементы управления, содержащие заголовок и один произвольный объект

Класс HeaderedContentControl наследует от ContentControl и отображает содержимое с заголовком. Он наследует свойство содержимого, Content, от ContentControl и определяет свойство Header, которое имеет тип Object; поэтому оба они могут быть произвольными объектами.

Следующие элементы управления наследуют от HeaderedContentControl и используют его модель содержимого:

На следующем рисунке показаны два объекта TabItem. У первого объекта TabItem имеются объекты UIElement в качестве Header и Content. Объекту Header присвоен объект StackPanel, который содержит Ellipse и TextBlock. Объекту Content присвоен объект StackPanel, который содержит TextBlock и Label. У второго объекта TabItem для свойств Header и TextBlock в свойстве Content задано строковое значение.

TabControl that uses different types in the Header property.

Пример создания объектов TabItem см. в разделе HeaderedContentControl.

Элементы управления, содержащие коллекцию произвольных объектов

Класс ItemsControl наследует от Control и может содержать несколько элементов, таких как строки, объекты или другие элементы. У него имеются свойства содержимого ItemsSource и Items. ItemsSource обычно используется для заполнения ItemsControl с помощью коллекции данных. Если вы не хотите использовать коллекцию для заполнения ItemsControl, можно добавлять элементы с помощью свойства Items.

Следующие элементы управления наследуют от ItemsControl и используют его модель содержимого:

На следующем рисунке показан объект ListBox, содержащий элементы следующих типов:

Screenshot that shows a ListBox with four types of content.

Элементы управления, содержащие заголовок и коллекцию произвольных объектов

Класс HeaderedItemsControl наследует от ItemsControl и может содержать несколько элементов, таких как строки, объекты или другие элементы и заголовок. Он наследует свойства содержимого ItemsControl, ItemsSource и Items, а также определяет свойство Header, которое может быть произвольным объектом.

Следующие элементы управления наследуют от HeaderedItemsControl и используют его модель содержимого:

Классы, содержащие коллекцию объектов UIElement

Класс Panel выполняет позиционирование и упорядочивание дочерних объектов UIElement. Свойство содержимого у этого класса имеет значение Children.

Следующие классы наследуют от класса Panel и используют его модель содержимого:

Дополнительные сведения см. в разделе Общие сведения о панелях.

Классы, влияющие на внешний вид объекта UIElement

Класс Decorator применяет визуальные эффекты к оному дочернему элементу UIElement или вокруг него. Свойство содержимого у этого класса имеет значение Child. Следующие классы наследуют от Decorator и используют его модель содержимого:

На следующем рисунке показан объект TextBox, который дополнен располагающимся вокруг него объектом Border.

TextBox with black border
Элемент управления TextBlock с границей вокруг него

Классы, предоставляющие визуальную обратную связь об объекте UIElement

Класс Adorner предоставляет пользователю визуальные подсказки. Например, класс Adorner можно использовать для добавления функциональных обработчиков к элементам или предоставления информации о состоянии элемента управления. Класс Adorner предоставляет платформу, позволяющую создавать собственные декоративные элементы. WPF не предоставляет никаких реализованных графических элементов. Дополнительные сведения см. в разделе Общие сведения о декоративных элементах.

Классы, позволяющие пользователям вводить текст

WPF предоставляет три основных элемента управления, которые позволяют пользователям вводить текст. Каждый из этих элементов управления отображает текст по-разному. В следующей таблице приведены эти три элемента управления с поддержкой ввода текста, их возможности по отображению текста и свойства, которые содержат текст этого элемента управления.

Элемент управления В каком виде отображается текст Свойство содержимого
TextBox с обычным текстом; Text
RichTextBox Форматированный текст Document
PasswordBox Скрытый текст (символы скрыты) Password

Классы, отображающие пользовательский текст

Некоторые классы могут использоваться для отображения простого или форматированного текста. Для отображения текста небольшого объема можно использовать TextBlock. Если нужно отобразить текст большого объем, то следует использовать такие элементы управления, как FlowDocumentReader, FlowDocumentPageViewer или FlowDocumentScrollViewer.

У TextBlock имеется два свойства содержимого: Text и Inlines. Если требуется отобразить текст с единообразным форматированием, лучше всего использовать свойство Text. Если предполагается использовать в тексте различное форматирование, нужно использовать свойство Inlines. Свойство Inlines представляет из себя коллекцию объектов Inline, которые определяют способ форматирования текста.

В следующей таблице перечислены свойства содержимого для классов FlowDocumentReader, FlowDocumentPageViewer и FlowDocumentScrollViewer.

Элемент управления Свойство содержимого Тип свойства содержимого
FlowDocumentPageViewer Документ IDocumentPaginatorSource
FlowDocumentReader Документ FlowDocument
FlowDocumentScrollViewer Документ FlowDocument

Объект FlowDocument реализует интерфейс IDocumentPaginatorSource, поэтому все три класса могут получать FlowDocument как содержимое.

Классы, выполняющие форматирование пользовательского текста

TextElement и связанные с ним классы позволяют форматировать текст. Объекты TextElement содержат текст и осуществляют его форматирование в объектах TextBlock и FlowDocument. Двумя основными типами объектов TextElement являются элементы Block и элементы Inline. Элемент Block представляет из себя блок текста (например, абзац или список). Элемент Inline представляет из себя часть текста в блоке. Многие классы Inline задают форматирование текста, к которому они применяются. Каждый из классов TextElement имеет собственную модель содержимого. Подробнее см. в разделе Общие сведения о модели содержимого TextElement.

См. также