Рисование форматированного текста
В этом разделе представлен обзор функций FormattedText объекта. Этот объект предоставляет низкоуровневый элемент управления для рисования текста в приложениях Windows Presentation Foundation (WPF).
Общие сведения о технологии
FormattedText Объект позволяет рисовать многострочный текст, в котором каждый символ в текст можно форматировать по отдельности. В следующем примере показан текст, к которому применено несколько форматов.
Note
Для разработчиков, осуществляющих переход с API Win32, в таблице из раздела Миграция Win32 перечислены флаги DrawText Win32 и примерный эквивалент в Windows Presentation Foundation (WPF).
Причины использования форматированного текста
WPF содержит несколько элементов управления для рисования текста на экране. Каждый элемент управления предназначен для своего сценария и имеет собственный список функций и ограничений. В общем случае TextBlock элемент должен использоваться при необходимости, например короткого предложения в ограниченная поддержка текста UI . Label может использоваться, если требуется Минимальная текстовая поддержка. Дополнительные сведения см. в разделе Документы в WPF.
FormattedText Объект предоставляет больше функций, чем форматирования текста Windows Presentation Foundation (WPF) текстовых элементов управления и могут быть полезны в тех случаях, когда использовать текст как декоративный элемент. Дополнительные сведения см. в следующем разделе: Преобразование форматированного текста в геометрический объект.
Кроме того FormattedText объект удобна для создания ориентированных на текст DrawingVisual-объекты, производные от. DrawingVisual — Это упрощенный класс, используемый для отрисовки фигур, изображений и текста. Дополнительные сведения см. в разделе Пример проверки нажатия с использованием DrawingVisuals.
Использование объекта FormattedText
Чтобы создать форматированный текст, вызовите FormattedText конструктор для создания FormattedText объекта. После создания исходной строки форматированного текста можно применить ряд стилей форматирования.
Используйте MaxTextWidth свойство для ограничения текста по ширине. Текст будет автоматически перенесен, чтобы заданная ширина не была нарушена. Используйте MaxTextHeight свойство для ограничения текста по высоте. Если текст выходит за указанные пределы по высоте, отображается многоточие (…).
К одному или более символам можно применить несколько стилей форматирования. Например, можно вызвать оба 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. Для разработчиков, осуществляющих переход с API Win32, в таблице перечислены флаги DrawText Win32 и примерный эквивалент в Windows Presentation Foundation (WPF).
Флаг DrawText | Эквивалент WPF | Примечания |
---|---|---|
DT_BOTTOM | Height | Используйте Height свойство для вычисления соответствующей Win32 позиции DrawText «y». |
DT_CALCRECT | Height, Width | Используйте Height и Width для вычисления выходного прямоугольника. |
DT_CENTER | TextAlignment | Используйте TextAlignment свойство со значением, равным Center. |
DT_EDITCONTROL | Нет | Не требуется. Ширина пробелов и отрисовка последней строки соответствуют этим параметрам в элементе управления редактированием среды. |
DT_END_ELLIPSIS | Trimming | Используйте Trimming свойством со значением CharacterEllipsis. Используйте WordEllipsis для получения Win32 DT_END_ELLIPSIS с конечным многоточием — в этом случае символ многоточия происходит только по словам, которые не помещаются на одной строке. |
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 свойство для вычисления соответствующей Win32 позиции DrawText «y». |
DT_WORDBREAK | Нет | Не требуется. Перенос слов выполняется автоматически с FormattedText объектов. Его нельзя отключить. |
DT_WORD_ELLIPSIS | Trimming | Используйте Trimming свойством со значением WordEllipsis. |