Desenhando texto formatado

Este tópico fornece uma visão geral dos recursos do FormattedText objeto. Este objeto fornece controle de baixo nível para desenhar texto em aplicativos Windows Presentation Foundation (WPF).

Visão geral da tecnologia

O FormattedText objeto permite desenhar texto de várias linhas, no qual cada caractere no texto pode ser formatado individualmente. O exemplo a seguir mostra um texto ao qual forma aplicados diversos formatos.

Text displayed using FormattedText object

Observação

Para os desenvolvedores que migram da API do Win32, a tabela na seção Migração do Win32 lista os sinalizadores Win32 DrawText e o equivalente aproximado no Windows Presentation Foundation (WPF).

Motivos para usar texto formatado

WPF inclui vários controles para desenhar texto para a tela. Cada controle é destinado a um cenário diferente e tem sua própria lista de recursos e limitações. Em geral, o elemento deve ser usado quando o TextBlock suporte de texto limitado é necessário, como uma breve frase em uma interface do usuário (UI). Label pode ser usado quando o suporte mínimo de texto é necessário. Para obter mais informações, consulte Documentos no WPF.

O FormattedText objeto fornece recursos de formatação de texto maiores do que os controles de texto do Windows Presentation Foundation (WPF) e pode ser útil nos casos em que você deseja usar o texto como um elemento decorativo. Para obter mais informações, consulte a seção a seguir Convertendo texto formatado em uma geometria.

Além disso, o FormattedText objeto é útil para criar objetos derivados orientados a DrawingVisualtexto. DrawingVisual é uma classe de desenho leve usada para renderizar formas, imagens ou texto. Para obter mais informações, consulte Teste de clique usando uma amostra de DrawingVisuals.

Usando o objeto FormattedText

Para criar texto formatado, chame o FormattedText construtor para criar um FormattedText objeto. Após ter criado a cadeia de caracteres de texto formatado inicial, você poderá aplicar uma variedade de estilos de formatação.

Use a propriedade para restringir o texto a MaxTextWidth uma largura específica. O texto será encapsulado automaticamente para evitar que a largura especificada seja ultrapassada. Use a propriedade para restringir o texto a MaxTextHeight uma altura específica. O texto exibirá reticências, "...", para o texto que ultrapassa a altura especificada.

Text displayed with wordwrap and ellipsis.

É possível aplicar vários estilos de formatação a um ou mais caracteres. Por exemplo, você pode chamar os SetFontSize métodos e SetForegroundBrush para alterar a formatação dos cinco primeiros caracteres no texto.

O exemplo de código a seguir cria um objeto e, em seguida, aplica vários estilos de FormattedText formatação ao 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

Unidade de medida do tamanho da fonte

Como com outros objetos de texto em aplicativos do Windows Presentation Foundation (WPF), o FormattedText objeto usa pixels independentes de dispositivo como a unidade de medida. No entanto, a maioria dos aplicativos Win32 usam pontos como a unidade de medida. Se você quiser usar texto de exibição em unidades de pontos em aplicativos do Windows Presentation Foundation (WPF), será necessário converter unidades independentes de dispositivo (1/96 polegada por unidade) em pontos. O exemplo de código a seguir mostra como realizar essa conversão.

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

Convertendo texto formatado em uma geometria

Você pode converter texto formatado em Geometry objetos, permitindo que você crie outros tipos de texto visualmente interessante. Por exemplo, você pode criar um Geometry objeto com base na estrutura de tópicos de uma cadeia de caracteres de texto.

Text outline using a linear gradient brush

Os exemplos a seguir ilustram várias maneiras de criar efeitos visuais interessantes modificando o traço, o preenchimento e o realce do texto convertido.

Text with different colors for fill and stroke

Text with image brush applied to stroke

Text with image brush applied to stroke and highlight

Quando o texto é convertido em um Geometry objeto, ele não é mais uma coleção de caracteres — não é possível modificar os caracteres na cadeia de caracteres de texto. No entanto, é possível afetar a aparência do texto convertido modificando suas propriedades de traço e preenchimento. O traço refere-se ao contorno do texto convertido; o preenchimento refere-se à área dentro do contorno do texto convertido. Para obter mais informações, consulte Criar texto contornado.

Você também pode converter texto formatado em um PathGeometry objeto e usar o objeto para realçar o texto. Por exemplo, você pode aplicar uma animação ao PathGeometry objeto para que a animação siga a estrutura de tópicos do texto formatado.

O exemplo a seguir mostra o texto formatado que foi convertido em um PathGeometry objeto. Reticências animadas seguem o caminho dos traços do texto renderizado.

Sphere following the path geometry of text
Esfera seguindo a geometria de caminho do texto

Para obter mais informação, consulte Como criar uma animação de PathGeometry para texto.

Você pode criar outros usos interessantes para o texto formatado depois que ele tiver sido convertido em um PathGeometry objeto. Por exemplo, você pode recortar um vídeo para exibir dentro dele.

Video displaying in the path geometry of text

Migração do Win32

Os recursos de FormattedText para desenhar texto são semelhantes aos recursos da função Win32 DrawText. Para os desenvolvedores que migram da API do Win32, a tabela a seguir lista os sinalizadores Win32 DrawText e o equivalente aproximado no Windows Presentation Foundation (WPF).

Sinalizador DrawText Equivalente ao WPF Observações
DT_BOTTOM Height Use a Height propriedade para calcular uma posição 'y' Win32 DrawText apropriada.
DT_CALCRECT Height, Width Use as Height propriedades e Width para calcular o retângulo de saída.
DT_CENTER TextAlignment Use a TextAlignment propriedade com o valor definido como Center.
DT_EDITCONTROL Nenhum Não necessário. A largura do espaço e a renderização da última linha são iguais aos valores no controle de edição da estrutura.
DT_END_ELLIPSIS Trimming Use a Trimming propriedade com o valor CharacterEllipsis.

Use WordEllipsis para obter DT_END_ELLIPSIS do Win32 com reticências de DT_WORD_ELIPSIS final — nesse caso, as reticências de caracteres só ocorrem em palavras que não cabem em uma única linha.
DT_EXPAND_TABS Nenhum Não necessário. As guias são expandidas automaticamente para paradas a cada 4 ems, o que é aproximadamente a largura de 8 caracteres independentes do idioma.
DT_EXTERNALLEADING Nenhum Não necessário. O entrelinhamento externo sempre é incluído no espaçamento entre linhas. Use a LineHeight propriedade para criar espaçamento de linha definido pelo usuário.
DT_HIDEPREFIX Nenhum Não há suporte. Remova o '&' da cadeia de caracteres antes de construir o FormattedText objeto.
DT_LEFT TextAlignment Este é o alinhamento de texto padrão. Use a TextAlignment propriedade com o valor definido como Left. (Somente WPF)
DT_MODIFYSTRING Nenhum Não há suporte.
DT_NOCLIP VisualClip O recorte não acontece automaticamente. Se você quiser cortar texto, use a VisualClip propriedade.
DT_NOFULLWIDTHCHARBREAK Nenhum Não há suporte.
DT_NOPREFIX Nenhum Não necessário. O caractere "&" nas cadeias de caracteres sempre é tratado como um caractere normal.
DT_PATHELLIPSIS Nenhum Use a Trimming propriedade com o valor WordEllipsis.
DT_PREFIX Nenhum Não há suporte. Se você quiser usar sublinhados para texto, como uma tecla aceleradora ou link, use o SetTextDecorations método.
DT_PREFIXONLY Nenhum Não há suporte.
DT_RIGHT TextAlignment Use a TextAlignment propriedade com o valor definido como Right. (Somente WPF)
DT_RTLREADING FlowDirection Defina a propriedade FlowDirection como RightToLeft.
DT_SINGLELINE Nenhum Não necessário. FormattedText objetos se comportam como um controle de linha única, a menos que a MaxTextWidth propriedade esteja definida ou o texto contenha um retorno de carro/alimentação de linha (CR/LF).
DT_TABSTOP Nenhum Não há suporte para posições de parada de tabulação definidas pelo usuário.
DT_TOP Height Não necessário. A justificação superior é o padrão. Outros valores de posicionamento vertical podem ser definidos usando a Height propriedade para calcular uma posição 'y' Win32 DrawText apropriada.
DT_VCENTER Height Use a Height propriedade para calcular uma posição 'y' Win32 DrawText apropriada.
DT_WORDBREAK Nenhum Não necessário. A quebra de palavras acontece automaticamente com FormattedText objetos. Não é possível desabilitá-la.
DT_WORD_ELLIPSIS Trimming Use a Trimming propriedade com o valor WordEllipsis.

Confira também