Подтвердить что ты не робот

Запуск против содержимого и текста в WPF

В WPF (или даже приложении Windows 8 или 8.1) у вас есть три возможных способа добавления текста в элемент управления.

  • Run элемент внутри элемента TextBlock

    <TextBlock>
        <Run>My text</Run>
    </TextBlock>
    
  • Text свойство как атрибут элемента TextBlock

    <TextBlock Text="My text" />
    
  • Text свойство как элемент внутри элемента TextBlock

    <TextBlock>
        <TextBlock.Text>my text</TextBlock.Text>
    </TextBlock>`
    

В чем разница между этими тремя подходами? И почему вы должны использовать Text для TextBlock и Content для a ComboboxItem?

4b9b3361

Ответ 1

Элемент управления с свойством Text может принимать только строку и обрабатываться определенным способом, управляемым этим элементом управления. Примерами таких элементов управления являются TextBlock и TextBox.

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

ContentPresenter использует следующую логику для отображения Контента:

  • Если свойство ContentTemplate в ContentPresenter установлено, ContentPresenter применяет этот DataTemplate к свойству Content, а полученный UIElement и его дочерние элементы отображаются, если таковые имеются. Дополнительные сведения о объектах DataTemplate см. В разделе Обзор шаблонов данных.
  • Если свойство ContentTemplateSelector в ContentPresenter установлено, ContentPresenter применяет соответствующий DataTemplate к свойству Content, а полученный UIElement и его дочерние элементы отображаются, если таковые имеются.
  • Если есть DataTemplate, связанный с типом Контента, ContentPresenter применяет этот DataTemplate к свойству Content, и полученный UIElement и его дочерние элементы, если они есть, отображаются.
  • Если Content является объектом UIElement, отображается UIElement. Если UIElement уже имеет родителя, возникает исключение.
  • Если есть TypeConverter, который преобразует тип содержимого в UIElement, ContentPresenter использует этот TypeConverter, и отображается отображаемое UIElement.
  • Если есть TypeConverter, который преобразует тип Контента в строку, ContentPresenter использует этот TypeConverter и создает TextBlock, чтобы содержать эту строку. Отобразится TextBlock.
  • Если содержимое является XmlElement, значение свойства InnerText отображается в TextBlock.
  • ContentPresenter вызывает метод ToString в Контенте и создает TextBlock, чтобы содержать строку, возвращаемую ToString. Отобразится TextBlock.

В случае класса TextBlock у вас есть возможность либо установить свойство Text, либо установить Inlines свойство. Настройка Text будет просто отображать текст. Установка Inlines (которая является по умолчанию, если вы помещаете содержимое внутри тела тега xaml) позволяет вам форматировать текст. Например, вы можете использовать Run с FontWeight установлен на Bold, чтобы сделать определенное слово или фразу полужирным в предложении. Вы можете использовать LineBreak, чтобы вставить новую строку. Вы можете даже использовать InlineUIContainer для вставки пользовательских элементов интерфейса в текст. Все, что происходит от класса Inline, можно найти в этой коллекции.

TextBlock предназначен для простых бит форматированного текста. Если вы хотите еще более мощные функции стиля документа, вы можете посмотреть FlowDocument, который используется элементами управления, такими как RichTextBox, FlowDocumentScrollViewer и FlowDocumentReader.

Что касается разницы между <TextBlock Text="something" /> и <TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>, то на самом деле это не разница. Это всего лишь два разных способа, с помощью которых вы можете установить свойства на что-то в файле xaml. Вторая версия обычно используется только тогда, когда вам нужно определить дополнительные элементы внутри сеттера.

Ответ 2

Краткое слово "Элементы свойства"

Это просто дополнительное замечание о большом ответе Ксавьера.

На самом деле нет большой разницы между:

<TextBlock Text="something" />

и

<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>

Это потому, что свойство Text имеет тип String, который является простым типом, который может быть установлен как Text="something".

Последний синтаксис в приведенном выше примере называется "элементами свойства". Он обычно используется при установке атрибута элемента на сложный тип.

Пример:

<Button>
  <Button.Content>
     <Rectangle Height="20", Width="20", Fill="Black"/>
  </Button.Content>
</Button>

В этом примере вы можете прямо установить "Прямоугольник" напрямую, не используя Button.Content, но для других примеров синтаксис можно использовать для установки атрибута сложного типа.