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

Обновлен: Ноябрь 2007

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

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

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

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

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

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

ms752098.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

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

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

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

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

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

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

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

В следующем примере кода создается объект 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));
}

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

Как и для других текстовых объектов в приложениях 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);

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

Можно преобразовать форматированный текст в объекты 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.

См. также

Задачи

Пример наложения текста на видео

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

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

Документы в Windows Presentation Foundation

Типография в Windows Presentation Foundation

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

Ссылки

FormattedText