Рисование форматированного текста

В этом разделе представлен обзор функций FormattedText объекта. Этот объект предоставляет низкоуровневый элемент управления для рисования текста в приложениях Windows Presentation Foundation (WPF).

Общие сведения о технологиях

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

Текст, отображаемый с помощью объекта FormattedText

Замечание

Для тех разработчиков, которые переносятся из API Win32, в таблице раздела "Миграция Win32 " перечислены флаги Win32 DrawText и приблизительные эквиваленты в Windows Presentation Foundation (WPF).

Причины использования форматированного текста

WPF включает несколько элементов управления для рисования текста на экране. Каждый элемент управления предназначен для другого сценария и имеет собственный список функций и ограничений. Как правило, элемент TextBlock следует использовать, если требуется ограниченная поддержка текста, например краткое предложение в пользовательском интерфейсе. Label можно использовать, если требуется минимальная поддержка текста. Дополнительные сведения см. в разделе "Документы" в WPF.

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

Кроме того, FormattedText объект полезен для создания текстовых производных DrawingVisual объектов. DrawingVisual — это упрощенный класс рисования, используемый для отрисовки фигур, изображений или текста. Дополнительные сведения см. в разделе "Тест попадания" с помощью примера DrawingVisuals.

Использование объекта FormattedText

Чтобы создать форматированный текст, вызовите FormattedText конструктор для создания FormattedText объекта. После создания исходной текстовой строки форматирования можно применить диапазон стилей форматирования.

MaxTextWidth Используйте свойство, чтобы ограничить текст определенной шириной. Текст будет автоматически обтекаться, чтобы избежать превышения указанной ширины. MaxTextHeight Используйте свойство, чтобы ограничить текст определенной высотой. Текст будет отображать многоточие "..." для текста, превышающего указанную высоту.

Текст, отображаемый с помощью wordwrap и многоточия.

К одному или нескольким символам можно применить несколько стилей форматирования. Например, можно вызвать и SetFontSizeSetForegroundBrush методы, чтобы изменить форматирование первых пяти символов в тексте.

В следующем примере кода создается FormattedText объект, а затем применяется несколько стилей форматирования к тексту.

protected override void OnRender(DrawingContext drawingContext)
{
    string testString = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor";

    // Create the initial formatted text string.
    FormattedText formattedText = new FormattedText(
        testString,
        CultureInfo.GetCultureInfo("en-us"),
        FlowDirection.LeftToRight,
        new Typeface("Verdana"),
        32,
        Brushes.Black);

    // Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
    formattedText.MaxTextWidth = 300;
    formattedText.MaxTextHeight = 240;

    // Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
    // The font size is calculated in terms of points -- not as device-independent pixels.
    formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);

    // Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
    formattedText.SetFontWeight(FontWeights.Bold, 6, 11);

    // Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
    formattedText.SetForegroundBrush(
                            new LinearGradientBrush(
                            Colors.Orange,
                            Colors.Teal,
                            90.0),
                            6, 11);

    // Use an Italic font style beginning at the 28th character and continuing for 28 characters.
    formattedText.SetFontStyle(FontStyles.Italic, 28, 28);

    // Draw the formatted text string to the DrawingContext of the control.
    drawingContext.DrawText(formattedText, new Point(10, 0));
}
Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext)
    Dim testString As String = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor"

    ' Create the initial formatted text string.
    Dim formattedText As New FormattedText(testString, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, New Typeface("Verdana"), 32, Brushes.Black)

    ' Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
    formattedText.MaxTextWidth = 300
    formattedText.MaxTextHeight = 240

    ' Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
    ' The font size is calculated in terms of points -- not as device-independent pixels.
    formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5)

    ' Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
    formattedText.SetFontWeight(FontWeights.Bold, 6, 11)

    ' Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
    formattedText.SetForegroundBrush(New LinearGradientBrush(Colors.Orange, Colors.Teal, 90.0), 6, 11)

    ' Use an Italic font style beginning at the 28th character and continuing for 28 characters.
    formattedText.SetFontStyle(FontStyles.Italic, 28, 28)

    ' Draw the formatted text string to the DrawingContext of the control.
    drawingContext.DrawText(formattedText, New Point(10, 0))
End Sub

Единица измерения размера шрифта

Как и в других текстовых объектах в приложениях Windows Presentation Foundation (WPF), FormattedText объект использует независимые от устройства пиксели в качестве единицы измерения. Однако большинство приложений Win32 используют точки в качестве единицы измерения. Если вы хотите использовать отображаемый текст в единицах точек в приложениях Windows Presentation Foundation (WPF), необходимо преобразовать независимые от устройства единицы (1/96-й дюйм на единицу) в точки. В следующем примере кода показано, как выполнить это преобразование.

// The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);
' The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5)

Преобразование форматированного текста в геометрию

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

контур текста с использованием линейной градиентной кисти

В следующих примерах показано несколько способов создания интересных визуальных эффектов путем изменения штриха, заливки и выделения преобразованного текста.

Текст с различными цветами для заливки и обводки

Текст с кистью изображения, примененной к штриху

Текст с использованием кисти изображения, примененной к обводке и выделению

Если текст преобразуется в объект Geometry, он больше не является коллекцией символов— нельзя изменять символы в текстовой строке. Однако вы можете повлиять на внешний вид преобразованного текста, изменив его штрих и свойства заливки. Росчерк ссылается на контур преобразованного текста; Заливка ссылается на область внутри контура преобразованного текста. Дополнительные сведения см. в разделе "Создание контурного текста".

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

В следующем примере показан форматированный текст, преобразованный в PathGeometry объект. Анимированный эллипс движется по траектории отрисованного текста.

Сфера, следующая геометрии текстового пути
Сфера, следующая геометрии пути текста

Дополнительные сведения см. в разделе "Практическое руководство. Создание анимации PathGeometry для текста".

Вы можете создать другие интересные методы для отформатированного текста после его преобразования в PathGeometry объект. Например, вы можете клипировать видео для отображения внутри него.

Видео, отображаемое в геометрии пути текста

Миграция Win32

Функции рисования FormattedText текста похожи на функции Win32 DrawText. Для тех разработчиков, которые переносятся из API Win32, в следующей таблице перечислены флаги Win32 DrawText и приблизительные эквиваленты в Windows Presentation Foundation (WPF).

Флаг DrawText Эквивалент WPF Примечания.
DT_BOTTOM Height Используйте свойство Height для вычисления соответствующей позиции 'y' для Win32 DrawText.
DT_CALCRECT Height, Width Используйте свойства Height и Width для вычисления выходного прямоугольника.
DT_CENTER TextAlignment TextAlignment Используйте свойство с заданным Centerзначением.
DT_EDITCONTROL Отсутствует Необязательно. Ширина пробела и отрисовка последней строки совпадают с элементом управления редактирования в фреймворке.
DT_КОНЕЦ_МНОГОТОЧИЯ Trimming Используйте свойство Trimming со значением CharacterEllipsis.

Используйте WordEllipsis, чтобы получить Win32 DT_END_ELLIPSIS с концом в виде многоточия DT_WORD_ELIPSIS — в этом случае многоточие добавляется только к словам, которые не помещаются в одну строку.
DT_EXPAND_TABS Отсутствует Необязательно. Вкладки автоматически развертываются, чтобы остановить каждые 4 эмс, что примерно равно ширине 8 символов, независимых от языка.
DT_EXTERNALLEADING Отсутствует Необязательно. Внешний ведущий всегда включается в интервалы строк. LineHeight Используйте свойство для создания определяемого пользователем интервала строк.
DT_HIDEPREFIX Отсутствует Не поддерживается. Удалите '&' из строки перед созданием FormattedText объекта.
DT_LEFT TextAlignment Это выравнивание текста по умолчанию. TextAlignment Используйте свойство с заданным Leftзначением. (только WPF)
DT_MODIFYSTRING Отсутствует Не поддерживается.
DT_NOCLIP VisualClip Вырезка не происходит автоматически. Если вы хотите обрезать текст, используйте VisualClip свойство.
DT_NOFULLWIDTHCHARBREAK Отсутствует Не поддерживается.
DT_NOPREFIX Отсутствует Необязательно. Символ '&' в строках всегда рассматривается как обычный символ.
DT_PATHELLIPSIS Отсутствует Используйте свойство Trimming со значением WordEllipsis.
DT_PREFIX Отсутствует Не поддерживается. Для использования подчеркивания в тексте, например, для клавиш ускорения или ссылок, используйте метод SetTextDecorations.
DT_PREFIXONLY Отсутствует Не поддерживается.
DT_RIGHT TextAlignment TextAlignment Используйте свойство с заданным Rightзначением. (только WPF)
DT_RTLREADING FlowDirection Задайте для свойства FlowDirection значение RightToLeft.
DT_SINGLELINE Отсутствует Необязательно. FormattedText объекты ведут себя как единое управление линией, если не задано свойство MaxTextWidth или текст содержит возврат каретки/перевод строки (CR/LF).
DT_TABSTOP Отсутствует Поддержка позиций остановки табуляции, определяемых пользователем, не поддерживается.
DT_TOP Height Необязательно. Основное обоснование — это значение по умолчанию. Другие значения вертикального позиционирования можно определить с помощью Height свойства для вычисления соответствующей позиции Win32 DrawText "y".
DT_VCENTER Height Используйте свойство Height для вычисления соответствующей позиции 'y' для Win32 DrawText.
DT_WORDBREAK Отсутствует Необязательно. Разделение слов происходит автоматически с FormattedText объектами. Вы не можете отключить его.
DT_WORD_ELLIPSIS Trimming Используйте свойство Trimming со значением WordEllipsis.

См. также