Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O WPF inclui suporte para a apresentação de conteúdo de texto por meio do uso de controles de interface do usuário (interface do usuário) avançados em recursos. Em geral, você pode dividir a renderização de texto em três camadas:
Usando o objeto FormattedText.
Usando controles de alto nível, como os objetos TextBlock e FlowDocument.
Este tópico fornece recomendações de desempenho de renderização de texto.
Renderização de texto no nível de glifos
O WPF (Windows Presentation Foundation) dá suporte avançado de texto, incluindo marcação em nível de glifos com acesso direto ao Glyphs para clientes que desejam interceptar e persistir texto após a formatação. Esses recursos fornecem suporte crítico para os diferentes requisitos de renderização de texto em cada um dos cenários a seguir.
Exibição de tela de documentos de formato fixo.
Cenários de impressão.
XAML (Extensible Application Markup Language) como uma linguagem utilizada para impressoras de dispositivos.
Writer de Documentos do Microsoft XPS.
A saída de drivers de impressão anteriores é de aplicativos Win32 para o formato fixo.
Formato do spool de impressão.
Representação de documento de formato fixo, incluindo clientes para versões anteriores do Windows e outros dispositivos de computação.
Observação
Glyphs e GlyphRun são projetados para cenários de impressão e apresentação de documento de formato fixo. O WPF fornece vários elementos para cenários gerais de layout e interface do usuário, como Label e TextBlock. Para mais informações sobre layout e cenários de IU, consulte Tipografia no WPF.
Os exemplos a seguir mostram como definir propriedades para um objeto Glyphs em XAML. Os exemplos pressupõem que as fontes Arial, Courier New e Times New Roman estão instaladas na pasta C:\WINDOWS\Fonts no computador local.
<!-- The example shows how to use a Glyphs object. -->
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<StackPanel Background="PowderBlue">
<Glyphs
FontUri = "C:\WINDOWS\Fonts\TIMES.TTF"
FontRenderingEmSize = "100"
StyleSimulations = "BoldSimulation"
UnicodeString = "Hello World!"
Fill = "Black"
OriginX = "100"
OriginY = "200"
/>
</StackPanel>
</Page>
Usando DrawGlyphRun
Se você tiver controle personalizado e quiser renderizar glifos, use o método DrawGlyphRun.
O WPF também fornece serviços de nível inferior para formatação de texto personalizado por meio do uso do objeto FormattedText. A maneira mais eficiente de renderizar texto no WPF (Windows Presentation Foundation) é gerando conteúdo de texto no nível do glifo usando Glyphs e GlyphRun. No entanto, o custo dessa eficiência é a perda de formatação de texto avançado fácil de usar, que são recursos internos de controles do WPF (Windows Presentation Foundation), como TextBlock e FlowDocument.
Objeto FormattedText
O objeto FormattedText permite que você desenhe um texto de várias linhas, no qual cada caractere no texto pode ser formatado individualmente. Para mais informações, consulte Desenhar Texto Formatado.
Para criar texto formatado, chame o construtor FormattedText para criar um objeto FormattedText. Depois de criar a cadeia de caracteres de texto formatada inicial, você pode aplicar um intervalo de estilos de formatação. Se o aplicativo quiser implementar seu próprio layout, o objeto FormattedText será melhor do que usar um controle, como TextBlock. Para obter mais informações sobre o objeto FormattedText, consulte Desenho de Texto Formatado.
O objeto FormattedText fornece capacidade de formatação de texto de baixo nível. Você pode aplicar vários estilos de formatação a um ou mais caracteres. Por exemplo, você pode chamar os métodos SetFontSize e SetForegroundBrush para alterar a formatação dos cinco primeiros caracteres no texto.
O exemplo de código a seguir cria um objeto FormattedText e o renderiza.
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
Controles de rótulo, TextBlock e FlowDocument
O WPF inclui vários controles para desenhar texto na tela. Cada controle é direcionado a um cenário diferente e tem sua própria lista de recursos e limitações.
FlowDocument afeta o desempenho mais do que textBlock ou rótulo
Em geral, o elemento TextBlock deve ser usado quando o suporte a texto limitado é necessário, como uma breve frase em uma interface do usuário (interface do usuário). Label pode ser usado quando o suporte mínimo de texto é necessário. O elemento FlowDocument é um contêiner para documentos refluíveis que suportam uma apresentação rica de conteúdo e, portanto, tem um impacto de desempenho maior em comparação com o uso dos controles TextBlock ou Label.
Para obter mais informações sobre FlowDocument, consulte Visão geral do documento Flow.
Evite usar o TextBlock no FlowDocument
O elemento TextBlock é derivado de UIElement. O elemento Run é derivado de TextElement, que é menos caro de usar do que um objeto derivado de UIElement. Quando possível, use Run em vez de TextBlock para exibir conteúdo de texto em um FlowDocument.
O exemplo de marcação a seguir ilustra duas maneiras de definir o conteúdo do texto em um FlowDocument:
<FlowDocument>
<!-- Text content within a Run (more efficient). -->
<Paragraph>
<Run>Line one</Run>
</Paragraph>
<!-- Text content within a TextBlock (less efficient). -->
<Paragraph>
<TextBlock>Line two</TextBlock>
</Paragraph>
</FlowDocument>
Evitar usar a execução para definir propriedades de texto
Em geral, usar um Run em um TextBlock é mais intensivo em termos de desempenho do que não usar um objeto Run explícito. Se você estiver usando um Run para definir propriedades de texto, defina essas propriedades diretamente no TextBlock.
O exemplo de marcação a seguir ilustra essas duas maneiras de definir uma propriedade de texto, nesse caso, a propriedade FontWeight:
<!-- Run is used to set text properties. -->
<TextBlock>
<Run FontWeight="Bold">Hello, world</Run>
</TextBlock>
<!-- TextBlock is used to set text properties, which is more efficient. -->
<TextBlock FontWeight="Bold">
Hello, world
</TextBlock>
A tabela a seguir mostra o custo de exibir 1000 objetos TextBlock com e sem um Runexplícito.
| Tipo TextBlock | Tempo de criação (ms) | tempo de renderização (ms) |
|---|---|---|
| Propriedades de texto de configuração Run | 146 | 540 |
| Configuração das propriedades de texto do TextBlock | 43 | 453 |
Evite a associação de dados com a propriedade Label.Content
Imagine um cenário em que você tem um objeto Label que é atualizado com frequência de uma fonte de String. Ao associar os dados da propriedade Label do elemento Content ao objeto de origem String, você poderá experimentar um desempenho insatisfatório. Sempre que o String de origem é atualizado, o objeto String antigo é descartado e um novo String é recriado porque um objeto String é imutável, não pode ser modificado. Isso, por sua vez, faz com que o ContentPresenter do objeto Label descarte seu conteúdo antigo e regenere o novo conteúdo para exibir o novo String.
A solução para esse problema é simples. Se o Label não estiver definido como um valor de ContentTemplate personalizado, substitua o Label por um TextBlock e os dados associarão sua propriedade Text à cadeia de caracteres de origem.
| Propriedade vinculada a dados | tempo de atualização (ms) |
|---|---|
| Rótulo.Conteúdo | 835 |
| TextBlock.Text | 242 |
Hiperlink
O objeto Hyperlink é um elemento de fluxo de conteúdo em nível de linha que permite hospedar hiperlinks dentro do fluxo de conteúdo.
Combinar hiperlinks em um objeto TextBlock
Você pode otimizar o uso de vários elementos Hyperlink agrupando-os no mesmo TextBlock. Isso ajuda a minimizar o número de objetos que você cria em seu aplicativo. Por exemplo, talvez você queira exibir vários hiperlinks, como o seguinte:
MsN Home | Meu MSN
O exemplo de marcação a seguir mostra vários elementos TextBlock usados para exibir os hiperlinks:
<!-- Hyperlinks in separate TextBlocks. -->
<TextBlock>
<Hyperlink TextDecorations="None" NavigateUri="http://www.msn.com">MSN Home</Hyperlink>
</TextBlock>
<TextBlock Text=" | "/>
<TextBlock>
<Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>
</TextBlock>
O exemplo de marcação a seguir mostra uma maneira mais eficiente de exibir os hiperlinks, desta vez, usando um único TextBlock:
<!-- Hyperlinks combined in the same TextBlock. -->
<TextBlock>
<Hyperlink TextDecorations="None" NavigateUri="http://www.msn.com">MSN Home</Hyperlink>
<Run Text=" | " />
<Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>
</TextBlock>
Mostrando sublinhados em hiperlinks somente em eventos MouseEnter
Um objeto TextDecoration é uma ornamentação visual que você pode adicionar ao texto; no entanto, a sua instanciação pode exigir muitos recursos de desempenho. Se você fizer uso extensivo de elementos Hyperlink, considere mostrar um sublinhado somente quando um evento for acionado, como o evento MouseEnter. Para obter mais informações, consulte Especificar se um hiperlink é sublinhado.
A imagem a seguir mostra como o evento MouseEnter dispara o hiperlink sublinhado:
Hiperlinks 
O exemplo de marcação a seguir mostra um Hyperlink definido com e sem um sublinhado:
<!-- Hyperlink with default underline. -->
<Hyperlink NavigateUri="http://www.msn.com">
MSN Home
</Hyperlink>
<Run Text=" | " />
<!-- Hyperlink with no underline. -->
<Hyperlink Name="myHyperlink" TextDecorations="None"
MouseEnter="OnMouseEnter"
MouseLeave="OnMouseLeave"
NavigateUri="http://www.msn.com">
My MSN
</Hyperlink>
A tabela a seguir mostra o custo de desempenho para exibir mil elementos Hyperlink com e sem sublinhado.
| Hiperlink | Tempo de criação (ms) | tempo de renderização (ms) |
|---|---|---|
| Com sublinhado | 289 | 1130 |
| Sem sublinhado | 299 | 776 |
Recursos de Formatação de Texto
O WPF fornece serviços de formatação de rich text, como hifenizações automáticas. Esses serviços podem afetar o desempenho do aplicativo e só devem ser usados quando necessário.
Evitar uso desnecessário de hifenização
A hifenização automática localiza pontos de interrupção de hífen para linhas de texto e permite posições de interrupção adicionais para linhas em objetos TextBlock e FlowDocument. Por padrão, o recurso de hifenização automática é desabilitado nesses objetos. Você pode habilitar esse recurso definindo a propriedade IsHyphenationEnabled do objeto como true. No entanto, habilitar esse recurso faz com que o WPF inicie a interoperabilidade do COM (Component Object Model), o que pode afetar o desempenho do aplicativo. É recomendável que você não use hifenização automática, a menos que seja necessário.
Use as figuras com cuidado
Um elemento Figure representa uma parte do conteúdo de fluxo que pode ser posicionada de forma absoluta em uma página de conteúdo. Em alguns casos, um Figure pode fazer com que uma página inteira seja reformatada automaticamente se sua posição colidir com o conteúdo que já foi definido. Você pode minimizar a possibilidade de reformatação desnecessária agrupando elementos Figure próximos uns dos outros ou declarando-os próximos à parte superior do conteúdo em um cenário de tamanho de página fixo.
Parágrafo Ideal
O recurso de parágrafo ideal do objeto FlowDocument dispõe de parágrafos para que o espaço em branco seja distribuído da forma mais uniforme possível. Por padrão, o recurso de parágrafo ideal está desabilitado. Você pode habilitar esse recurso definindo a propriedade IsOptimalParagraphEnabled do objeto como true. No entanto, habilitar esse recurso afeta o desempenho do aplicativo. É recomendável que você não use o recurso de parágrafo ideal, a menos que precise dele.
Consulte também
.NET Desktop feedback