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


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

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

Пример кисти линейного градиента, применяемой к текстовому полю

Текст, отображенный при помощи кисти линейного градиента

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

Пример кисти линейного градиента, применяемой к геометрической форме контура текста

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

После того, как текст преобразован в объект Geometry, он больше не является набором символов — изменение символов в текстовой строке становится невозможным. Тем не менее, внешний вид преобразованного текста можно изменять с помощью свойств штриха и заливки. Штрих — это контур преобразованного текста, а заливка — область внутри контура преобразованного текста.

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

Пример установки разного цвета для штриха и заливки

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

Пример применения кисти к штриху

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

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

Пример применения кисти к обводке и выделению

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

Пример

Чтобы преобразовать текст в объект Geometry, необходимо использовать объект FormattedText. После создания этого объекта можно использовать методы BuildGeometry и BuildHighlightGeometry для преобразования текста в объекты Geometry. Первый метод возвращает геометрическую форму форматированного текста, а второй — геометрическую форму ограничивающего поля форматированного текста. В следующем примере показано создание объекта FormattedText и извлечение геометрических форм форматированного текста и его ограничивающего поля.

        ''' <summary>
        ''' Create the outline geometry based on the formatted text.
        ''' </summary>
        Public Sub CreateText()
            Dim fontStyle As FontStyle = FontStyles.Normal
            Dim fontWeight As FontWeight = FontWeights.Medium

            If Bold = True Then
                fontWeight = FontWeights.Bold
            End If
            If Italic = True Then
                fontStyle = FontStyles.Italic
            End If

            ' Create the formatted text based on the properties set.
            Dim formattedText As New FormattedText(Text, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, New Typeface(Font, fontStyle, fontWeight, FontStretches.Normal), FontSize, Brushes.Black) ' This brush does not matter since we use the geometry of the text.

            ' Build the geometry object that represents the text.
            _textGeometry = formattedText.BuildGeometry(New Point(0, 0))

            ' Build the geometry object that represents the text hightlight.
            If Highlight = True Then
                _textHighLightGeometry = formattedText.BuildHighlightGeometry(New Point(0, 0))
            End If
        End Sub
/// <summary>
/// Create the outline geometry based on the formatted text.
/// </summary>
public void CreateText()
{
    System.Windows.FontStyle fontStyle = FontStyles.Normal;
    FontWeight fontWeight = FontWeights.Medium;

    if (Bold == true) fontWeight = FontWeights.Bold;
    if (Italic == true) fontStyle = FontStyles.Italic;

    // Create the formatted text based on the properties set.
    FormattedText formattedText = new FormattedText(
        Text,
        CultureInfo.GetCultureInfo("en-us"),
        FlowDirection.LeftToRight,
        new Typeface(
            Font,
            fontStyle,
            fontWeight,
            FontStretches.Normal),
        FontSize,
        System.Windows.Media.Brushes.Black // This brush does not matter since we use the geometry of the text. 
        );

    // Build the geometry object that represents the text.
    _textGeometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0));

    // Build the geometry object that represents the text hightlight.
    if (Highlight == true)
    {
        _textHighLightGeometry = formattedText.BuildHighlightGeometry(new System.Windows.Point(0, 0));
    }
}

Чтобы отобразить извлеченные объекты Geometry, необходимо иметь доступ к DrawingContext объекта, который отображает преобразованный текст. В приведенных примерах кода это делается путем создания объекта пользовательского элемента управления, который является производным от класса, поддерживающего определенную пользователем отрисовку.

Чтобы отобразить объекты Geometry в пользовательском элементе управления, выполните переопределение для метода OnRender. Переопределенный метод должен использовать метод DrawGeometry для рисования объектов Geometry.

        ''' <summary>
        ''' OnRender override draws the geometry of the text and optional highlight.
        ''' </summary>
        ''' <param name="drawingContext">Drawing context of the OutlineText control.</param>
        Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext)
            ' Draw the outline based on the properties that are set.
            drawingContext.DrawGeometry(Fill, New Pen(Stroke, StrokeThickness), _textGeometry)

            ' Draw the text highlight based on the properties that are set.
            If Highlight = True Then
                drawingContext.DrawGeometry(Nothing, New Pen(Stroke, StrokeThickness), _textHighLightGeometry)
            End If
        End Sub
/// <summary>
/// OnRender override draws the geometry of the text and optional highlight.
/// </summary>
/// <param name="drawingContext">Drawing context of the OutlineText control.</param>
protected override void OnRender(DrawingContext drawingContext)
{
    // Draw the outline based on the properties that are set.
    drawingContext.DrawGeometry(Fill, new System.Windows.Media.Pen(Stroke, StrokeThickness), _textGeometry);

    // Draw the text highlight based on the properties that are set.
    if (Highlight == true)
    {
        drawingContext.DrawGeometry(null, new System.Windows.Media.Pen(Stroke, StrokeThickness), _textHighLightGeometry);
    }
}

См. также

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

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