Compartir a través de


Procedimiento para crear texto con contorno

Casi siempre, al adornar cadenas de texto en la aplicación de Windows Presentation Foundation (WPF), usamos texto en términos de una colección de caracteres discretos o glifos. Por ejemplo, podríamos crear un pincel de degradado lineal y aplicarlo a la propiedad Foreground de un objeto TextBox. Al mostrar o editar el cuadro de texto, el pincel de degradado lineal se aplica automáticamente al conjunto actual de caracteres de la cadena de texto.

Texto que se muestra con un pincel de degradado lineal

Sin embargo, también se puede convertir texto en objetos Geometry, lo que permite crear otros tipos de texto visualmente potentes. Por ejemplo, puede crear un objeto Geometry basado en el contorno de una cadena de texto.

Esquema de texto que usa un pincel de degradado lineal

Cuando el texto se convierte en un objeto Geometry, ya no es una colección de caracteres (los caracteres de la cadena de texto no se pueden modificar). Sin embargo, puede afectar a la apariencia del texto convertido modificando sus propiedades de trazo y relleno. El trazo se refiere al contorno del texto convertido; el relleno es el área dentro del contorno del texto convertido.

En los ejemplos siguientes se muestran varias maneras de crear efectos visuales modificando el trazo y el relleno del texto convertido.

Texto con colores diferentes para relleno y trazo

Texto con pincel de imagen aplicado a trazo

También se puede modificar el rectángulo de selección, o resaltado, del texto convertido. En el ejemplo siguiente se muestra una manera de crear efectos visuales modificando el trazo y el resaltado del texto convertido.

Texto con pincel de imagen aplicado a trazo y resaltado

Ejemplo

La clave para convertir texto en un objeto Geometry es usar el objeto FormattedText. Una vez creado este objeto, puede usar los métodos BuildGeometry y BuildHighlightGeometry para convertir el texto en objetos Geometry. El primer método devuelve la geometría del texto con formato, mientras que el segundo devuelve la geometría del rectángulo de selección del texto con formato. En el ejemplo de código siguiente se muestra cómo crear un objeto FormattedText y recuperar las geometrías del texto con formato y su rectángulo de selección.

/// <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 highlight.
    if (Highlight == true)
    {
        _textHighLightGeometry = formattedText.BuildHighlightGeometry(new System.Windows.Point(0, 0));
    }
}
''' <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 highlight.
    If Highlight = True Then
        _textHighLightGeometry = formattedText.BuildHighlightGeometry(New Point(0, 0))
    End If
End Sub

Para mostrar los objetos Geometry recuperados, hay que acceder al elemento DrawingContext del objeto que muestra el texto convertido. En estos ejemplos de código, este acceso se logra creando un objeto de control personalizado que se deriva de una clase que admite la representación definida por el usuario.

Para mostrar objetos Geometry en el control personalizado, proporcione una invalidación del método OnRender. El método invalidado debe usar el método DrawGeometry para dibujar los objetos 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 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);
    }
}
''' <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

Para obtener el origen del objeto de control de usuario personalizado de ejemplo, vea OutlineTextControl.cs para C# y OutlineTextControl.vb para Visual Basic.

Vea también