Поделиться через


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

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

В этом разделе содержатся следующие подразделы.

  • Общие сведения о технологии
  • Использование объекта FormattedText
  • Миграция Win32
  • Связанные разделы

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

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

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

Отображенный текст с использованием объекта FormattedText

ПримечаниеПримечание

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

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

В WPF представлен ряд элементов управления для рисования текста на экране. Каждый элемент управления предназначен для различных скриптов и содержит собственный список функций и ограничений. В целом, элемент TextBlock следует использовать, если требуется ограниченная поддержка текста, например для короткого предложения, которое нужно вставить в user interface (UI). Label может использоваться, если необходима минимальная поддержка текста. Дополнительные сведения см. в разделе Документы в WPF.

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

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

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

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

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

Отображенный текст с переносом слов и многоточием

Отображенный текст с использованием объекта FormattedText

Можно применить несколько стилей форматирования к одному или нескольким знакам. Например, можно вызвать как метод SetFontSize, так и метод SetForegroundBrush для изменения форматирования первых пяти знаков текста.

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

        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
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));
}

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

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

            ' 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. Для разработчиков, выполняющих задачи по миграции с Win32 API, в следующей таблице перечислены флаги 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

Отсутствует

Не требуется. Отрисовка последней строки и пустого места соответствует элементу управления редактированием в Framework.

DT_END_ELLIPSIS

Trimming

Используйте свойство Trimming со значением CharacterEllipsis.

Используйте WordEllipsis для получения DT_END_ELLIPSIS Win32 с заключительным многоточием DT_WORD_ELIPSIS. В этом случае знак многоточия отображается только в словах, которые не помещаются на одной строке.

DT_EXPAND_TABS

Отсутствует

Не требуется. Символы табуляции автоматически развертываются на четыре длинных пробела, что по ширине приблизительно равно восьми независимым от языка символам.

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 для вычисления соответствующей y-позиции Win32 DrawText.

DT_VCENTER

Height

Используйте свойство Height для вычисления соответствующей y-позиции Win32 DrawText.

DT_WORDBREAK

Отсутствует

Не требуется. Для объектов FormattedText перенос слов выполняется автоматически. Отключить эту функцию нельзя.

DT_WORD_ELLIPSIS

Trimming

Используйте свойство Trimming со значением WordEllipsis.

См. также

Задачи

Практическое руководство. Вывод текста по контуру

Ссылки

FormattedText

Основные понятия

Документы в WPF

Оформление в WPF

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