Compartir a través de


Dibujar texto con formato

En este tema se proporciona información general sobre las características del FormattedText objeto . Este objeto proporciona un control de bajo nivel para dibujar texto en aplicaciones de Windows Presentation Foundation (WPF).

Introducción a la tecnología

El FormattedText objeto permite dibujar texto de varias líneas, en el que cada carácter del texto se puede formatear individualmente. En el ejemplo siguiente se muestra el texto que tiene varios formatos aplicados.

Texto que se muestra mediante el objeto FormattedText

Nota:

Para aquellos desarrolladores que migran desde la API de Win32, la tabla de la sección Migración de Win32 enumera las marcas DrawText de Win32 y el equivalente aproximado en Windows Presentation Foundation (WPF).

Motivos para usar texto con formato

WPF incluye varios controles para dibujar texto en la pantalla. Cada control está dirigido a un escenario diferente y tiene su propia lista de características y limitaciones. En general, el TextBlock elemento debe usarse cuando se requiere compatibilidad limitada con texto, como una frase breve en una interfaz de usuario (UI). Label se puede usar cuando se requiere compatibilidad mínima con texto. Para obtener más información, vea Documentos en WPF.

El FormattedText objeto proporciona características de formato de texto mayores que los controles de texto de Windows Presentation Foundation (WPF) y puede ser útil en los casos en los que desea usar texto como elemento decorativo. Para obtener más información, consulte la sección siguiente Conversión de texto con formato a una geometría.

Además, el FormattedText objeto es útil para crear objetos derivados DrawingVisualorientados a texto. DrawingVisual es una clase de dibujo ligera que se usa para representar formas, imágenes o texto. Para obtener más información, vea Prueba de posicionamiento mediante drawingVisuals Sample.

Usar el objeto FormattedText

Para crear texto con formato, llame al FormattedText constructor para crear un FormattedText objeto . Una vez creada la cadena de texto con formato inicial, puede aplicar un intervalo de estilos de formato.

Use la MaxTextWidth propiedad para restringir el texto a un ancho específico. El texto se ajustará automáticamente para evitar superar el ancho especificado. Use la MaxTextHeight propiedad para restringir el texto a un alto específico. El texto mostrará los puntos suspensivos, "..." para el texto que supera el alto especificado.

Texto mostrado con wordwrap y puntos suspensivos.

Puede aplicar varios estilos de formato a uno o varios caracteres. Por ejemplo, podría llamar a los métodos SetFontSize y SetForegroundBrush para cambiar el formato de los cinco primeros caracteres del texto.

En el ejemplo de código siguiente se crea un FormattedText objeto y, a continuación, se aplican varios estilos de formato al texto.

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

Unidad de medida de tamaño de fuente

Al igual que con otros objetos de texto en aplicaciones de Windows Presentation Foundation (WPF), el FormattedText objeto usa píxeles independientes del dispositivo como unidad de medida. Sin embargo, la mayoría de las aplicaciones Win32 usan puntos como unidad de medida. Si quieres usar texto para mostrar en unidades de puntos en aplicaciones de Windows Presentation Foundation (WPF), debes convertir unidades independientes del dispositivo (1/96 pulgadas por unidad) a puntos. En el ejemplo de código siguiente se muestra cómo realizar esta conversión.

// 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)

Convertir texto con formato a una geometría

Puede convertir texto con formato en Geometry objetos, lo que le permite crear otros tipos de texto visualmente interesantes. Por ejemplo, podría crear un Geometry objeto basado en el esquema de una cadena de texto.

Contorno de texto mediante un pincel de degradado lineal

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

Texto con diferentes colores para relleno y trazo

Texto con pincel de imagen aplicado al trazo

Texto con pincel de imagen aplicado al trazo y resaltado

Cuando el texto se convierte en un Geometry objeto, ya no es una colección de caracteres; no se pueden modificar los caracteres de la cadena de texto. Sin embargo, puede afectar a la apariencia del texto convertido modificando sus propiedades de trazo y relleno. El trazo hace referencia al contorno del texto convertido; el relleno hace referencia al área dentro del contorno del texto convertido. Para obtener más información, vea Crear texto descrito.

También puede convertir texto con formato en un PathGeometry objeto y usar el objeto para resaltar el texto. Por ejemplo, podría aplicar una animación al PathGeometry objeto para que la animación siga el contorno del texto con formato.

En el ejemplo siguiente se muestra el texto con formato convertido en un PathGeometry objeto . Una elipse animada sigue la ruta de acceso de los trazos del texto representado.

Esfera después de la geometría de la ruta de acceso del texto
Esfera siguiendo la geometría del camino del texto

Para obtener más información, vea How to: Create a PathGeometry Animation for Text.

Puede crear otros usos interesantes para el texto con formato una vez convertido en un PathGeometry objeto . Por ejemplo, puede recortar vídeo para mostrarlo dentro de él.

Vídeo que se muestra en la geometría de la ruta de acceso del texto

Migración de Win32

Las características de FormattedText para dibujar texto son similares a las de la función DrawText de Win32. Para aquellos desarrolladores que migran desde la API de Win32, en la tabla siguiente se enumeran las marcas DrawText de Win32 y el equivalente aproximado en Windows Presentation Foundation (WPF).

Marca DrawText Equivalente de WPF Notas
DT_BOTTOM Height Utiliza la propiedad Height para calcular una posición 'y' adecuada en DrawText de Win32.
DT_CALCRECT Height, Width Use las Height propiedades y Width para calcular el rectángulo de salida.
DT_CENTER TextAlignment Utiliza la TextAlignment propiedad con el valor establecido en Center.
DT_EDITCONTROL Ninguno No es necesario. El ancho del espacio y la representación de la última línea son los mismos que en el control de edición del marco de trabajo.
DT_END_ELLIPSIS Trimming Use la Trimming propiedad con el valor CharacterEllipsis.

** Use WordEllipsis para obtener el efecto de DT_END_ELLIPSIS de Win32 con DT_WORD_ELIPSIS y elipsis al final; en este caso, los puntos suspensivos solo aparecen en palabras que no caben en una sola línea.
DT_EXPAND_TABS Ninguno No es necesario. Las pestañas se expanden automáticamente hasta paradas cada 4 ems, lo cual es aproximadamente el ancho de 8 caracteres independientes del idioma.
DT_EXTERNALLEADING Ninguno No es necesario. El interlineado externo siempre se incluye en el espaciado de líneas. Usa la propiedad LineHeight para crear espaciado de línea definido por el usuario.
DT_HIDEPREFIX Ninguno No está soportado. Quite el '&' de la cadena antes de construir el FormattedText objeto.
DT_LEFT TextAlignment Esta es la alineación de texto predeterminada. Utiliza la TextAlignment propiedad con el valor establecido en Left. (solo WPF)
DT_MODIFYSTRING Ninguno No está soportado.
DT_NOCLIP VisualClip El recorte no se produce automáticamente. Si desea recortar texto, use la VisualClip propiedad .
DT_NOFULLWIDTHCHARBREAK Ninguno No está soportado.
DT_NOPREFIX Ninguno No es necesario. El carácter '&' de las cadenas siempre se trata como un carácter normal.
DT_PATHELLIPSIS Ninguno Use la Trimming propiedad con el valor WordEllipsis.
DT_PREFIX Ninguno No está soportado. Si desea usar caracteres de subrayado para texto, como una tecla de aceleración o un vínculo, use el SetTextDecorations método .
DT_PREFIXONLY Ninguno No está soportado.
DT_RIGHT TextAlignment Utiliza la TextAlignment propiedad con el valor establecido en Right. (solo WPF)
DT_RTLREADING FlowDirection Establezca la propiedad FlowDirection en RightToLeft.
DT_SINGLELINE Ninguno No es necesario. FormattedText los objetos se comportan como un solo control de línea, a menos que se establezca la MaxTextWidth propiedad o el texto contenga un retorno de carro/avance de línea (CR/LF).
DT_TABSTOP Ninguno No se admiten posiciones de tabuladores definidas por el usuario.
DT_TOP Height No es necesario. La justificación superior es el valor predeterminado. Otros valores de posicionamiento vertical se pueden definir mediante la Height propiedad para calcular una posición adecuada de DrawText 'y' de Win32.
DT_VCENTER Height Utiliza la propiedad Height para calcular una posición 'y' adecuada en DrawText de Win32.
DT_WORDBREAK Ninguno No es necesario. La separación de palabras se produce automáticamente con objetos FormattedText. No se puede deshabilitar.
DT_WORD_ELLIPSIS Trimming Use la Trimming propiedad con el valor WordEllipsis.

Consulte también