Optimizar el rendimiento: TextoOptimizing Performance: Text

WPFWPF incluye compatibilidad para la presentación de contenido de texto mediante el uso de controles interfaz de usuario (UI)user interface (UI) completos.includes support for the presentation of text content through the use of feature-rich interfaz de usuario (UI)user interface (UI) controls. En general, puede dividir la representación de texto en tres capas:In general you can divide text rendering in three layers:

  1. Usar los objetos Glyphs y GlyphRun directamente.Using the Glyphs and GlyphRun objects directly.

  2. Usar el objeto FormattedText.Using the FormattedText object.

  3. Usar controles de alto nivel, como los objetos TextBlock y FlowDocument.Using high-level controls, such as the TextBlock and FlowDocument objects.

En este tema se proporcionan recomendaciones de rendimiento para la representación de texto.This topic provides text rendering performance recommendations.

Representación de texto en el nivel de glifosRendering Text at the Glyph Level

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona compatibilidad con texto avanzado, incluido el marcado de nivel de glifos con acceso directo a Glyphs para los clientes que quieren interceptar y conservar el texto después de darle formato.provides advanced text support including glyph-level markup with direct access to Glyphs for customers who want to intercept and persist text after formatting. Estas características ofrecen una compatibilidad fundamental para los distintos requisitos de representación de texto en cada uno de los siguientes escenarios.These features provide critical support for the different text rendering requirements in each of the following scenarios.

  • Presentación en pantalla de documentos de formato fijo.Screen display of fixed-format documents.

  • Escenarios de impresión.Print scenarios.

    • Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) como un lenguaje de impresora del dispositivo.as a device printer language.

    • Escritor de documentos XPS de Microsoft.Microsoft XPS Document Writer.

    • Controladores de impresora anteriores, que se envían desde aplicaciones Win32 al formato fijo.Previous printer drivers, output from Win32 applications to the fixed format.

    • Formato de cola de impresión.Print spool format.

  • Representación de documentos de formato fijo, incluidos clientes de versiones anteriores de Windows y otros dispositivos informáticos.Fixed-format document representation, including clients for previous versions of Windows and other computing devices.

Nota

Glyphs y GlyphRun están diseñados para escenarios de impresión y presentación de documentos de formato fijo.Glyphs and GlyphRun are designed for fixed-format document presentation and print scenarios. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona varios elementos para el diseño general y escenarios de interfaz de usuario (UI)user interface (UI) como Label y TextBlock.provides several elements for general layout and interfaz de usuario (UI)user interface (UI) scenarios such as Label and TextBlock. Para obtener más información sobre los escenarios de diseño y IUUI, consulte Tipografía en WPF.For more information on layout and IUUI scenarios, see the Typography in WPF.

En los siguientes ejemplos se muestra cómo definir las propiedades de un objeto Glyphs en Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML).The following examples show how to define properties for a Glyphs object in Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML). El objeto Glyphs representa la salida de un GlyphRun en XAMLXAML.The Glyphs object represents the output of a GlyphRun in XAMLXAML. En los ejemplos se supone que las fuentes Arial, Courier New y Times New Roman están instaladas en la carpeta C:\WINDOWS\Fonts del equipo local.The examples assume that the Arial, Courier New, and Times New Roman fonts are installed in the C:\WINDOWS\Fonts folder on the local computer.

<!-- 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>

Usar DrawGlyphRunUsing DrawGlyphRun

Si tiene un control personalizado y desea representar glifos, utilice el método DrawGlyphRun.If you have custom control and you want to render glyphs, use the DrawGlyphRun method.

WPFWPF también proporciona servicios de nivel inferior para el formato de texto personalizado mediante el uso del objeto FormattedText.also provides lower-level services for custom text formatting through the use of the FormattedText object. La forma más eficaz de representar texto en Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) es mediante la generación de contenido de texto en el nivel de glifo mediante Glyphs y GlyphRun.The most efficient way of rendering text in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) is by generating text content at the glyph level using Glyphs and GlyphRun. Sin embargo, el costo de esta eficacia es la pérdida de un formato de texto enriquecido fácil de usar, que son características integradas de Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) controles, como TextBlock y FlowDocument.However, the cost of this efficiency is the loss of easy to use rich text formatting, which are built-in features of Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) controls, such as TextBlock and FlowDocument.

Objeto FormattedTextFormattedText Object

El objeto FormattedText permite dibujar texto de varias líneas, en el que se puede dar formato a cada carácter del texto de forma individual.The FormattedText object allows you to draw multi-line text, in which each character in the text can be individually formatted. Para obtener más información, consulte Dibujar texto con formato.For more information, see Drawing Formatted Text.

Para crear texto con formato, llame al constructor FormattedText para crear un objeto FormattedText.To create formatted text, call the FormattedText constructor to create a FormattedText object. Una vez que haya creado la cadena inicial de texto con formato, podrá aplicar una gama de estilos de formato.Once you have created the initial formatted text string, you can apply a range of formatting styles. Si la aplicación desea implementar su propio diseño, el objeto FormattedText es mejor opción que el uso de un control, como TextBlock.If your application wants to implement its own layout, then the FormattedText object is better choice than using a control, such as TextBlock. Para obtener más información sobre el objeto FormattedText, vea dibujar texto con formato .For more information on the FormattedText object, see Drawing Formatted Text .

El objeto FormattedText proporciona funcionalidad de formato de texto de bajo nivel.The FormattedText object provides low-level text formatting capability. Puede aplicar varios estilos de formato a uno o más caracteres.You can apply multiple formatting styles to one or more characters. Por ejemplo, puede llamar a los métodos SetFontSize y SetForegroundBrush para cambiar el formato de los cinco primeros caracteres del texto.For example, you could call both the SetFontSize and SetForegroundBrush methods to change the formatting of the first five characters in the text.

En el ejemplo de código siguiente se crea un objeto FormattedText y se representa.The following code example creates a FormattedText object and renders it.

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 FlowDocument, TextBlock y LabelFlowDocument, TextBlock, and Label Controls

WPFWPF incluye varios controles para dibujar texto en la pantalla.includes multiple controls for drawing text to the screen. Cada control se destina a un escenario diferente y tiene su propia lista de características y limitaciones.Each control is targeted to a different scenario and has its own list of features and limitations.

FlowDocument afecta al rendimiento más que TextBlock o LabelFlowDocument Impacts Performance More than TextBlock or Label

En general, el elemento TextBlock debe usarse cuando se requiere compatibilidad de texto limitada, como una frase breve en un interfaz de usuario (UI)user interface (UI).In general, the TextBlock element should be used when limited text support is required, such as a brief sentence in a interfaz de usuario (UI)user interface (UI). Label se puede usar cuando se requiere compatibilidad de texto mínima.Label can be used when minimal text support is required. El elemento FlowDocument es un contenedor para documentos redistribuibles que admiten la presentación enriquecida de contenido y, por consiguiente, tiene un mayor impacto en el rendimiento que el uso de los controles TextBlock o Label.The FlowDocument element is a container for re-flowable documents that support rich presentation of content, and therefore, has a greater performance impact than using the TextBlock or Label controls.

Para obtener más información sobre FlowDocument, consulte información general sobre documentos dinámicos.For more information on FlowDocument, see Flow Document Overview.

Evitar el uso de TextBlock en FlowDocumentAvoid Using TextBlock in FlowDocument

El elemento TextBlock se deriva de UIElement.The TextBlock element is derived from UIElement. El elemento Run se deriva de TextElement, que es menos costoso de usar que un objeto derivado de UIElement.The Run element is derived from TextElement, which is less costly to use than a UIElement-derived object. Cuando sea posible, use Run en lugar de TextBlock para mostrar el contenido de texto en un FlowDocument.When possible, use Run rather than TextBlock for displaying text content in a FlowDocument.

En el ejemplo de marcado siguiente se muestran dos maneras de establecer el contenido de texto dentro de un FlowDocument:The following markup sample illustrates two ways of setting text content within a 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 el uso de ejecución para establecer propiedades de textoAvoid Using Run to Set Text Properties

En general, el uso de un Run dentro de un TextBlock es más intensivo de rendimiento que no usar un objeto de Run explícito.In general, using a Run within a TextBlock is more performance intensive than not using an explicit Run object at all. Si usa un Run para establecer propiedades de texto, establezca esas propiedades directamente en el TextBlock en su lugar.If you are using a Run in order to set text properties, set those properties directly on the TextBlock instead.

En el ejemplo de marcado siguiente se muestran estas dos maneras de establecer una propiedad de texto, en este caso, la propiedad FontWeight:The following markup sample illustrates these two ways of setting a text property, in this case, the FontWeight property:

<!-- 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>

En la tabla siguiente se muestra el costo de mostrar 1000 objetos TextBlock con y sin un Runexplícito.The following table shows the cost of displaying 1000 TextBlock objects with and without an explicit Run.

Tipo TextBlockTextBlock type Tiempo de creación (ms)Creation time (ms) Tiempo de representación (ms)Render time (ms)
Propiedades de texto de configuración de ejecuciónRun setting text properties 146146 540540
Propiedades de texto de configuración de TextBlockTextBlock setting text properties 4343 453453

Evitar el enlace de datos a la propiedad Label.ContentAvoid Databinding to the Label.Content Property

Imagine un escenario en el que tiene un objeto Label que se actualiza con frecuencia desde un origen de String.Imagine a scenario where you have a Label object that is updated frequently from a String source. Cuando el enlace de datos de la propiedad Content del elemento de Label al objeto de origen de String, puede experimentar un rendimiento deficiente.When data binding the Label element's Content property to the String source object, you may experience poor performance. Cada vez que se actualiza el String de origen, se descarta el objeto de String anterior y se vuelve a crear un nuevo String, porque un objeto de String es inmutable, no se puede modificar.Each time the source String is updated, the old String object is discarded and a new String is recreated—because a String object is immutable, it cannot be modified. Esto, a su vez, hace que el ContentPresenter del objeto Label deseche su contenido anterior y vuelva a generar el nuevo contenido para mostrar el nuevo String.This, in turn, causes the ContentPresenter of the Label object to discard its old content and regenerate the new content to display the new String.

La solución a este problema es sencilla.The solution to this problem is simple. Si el Label no se establece en un valor de ContentTemplate personalizado, reemplace el Label por un TextBlock y enlace de datos su Text propiedad a la cadena de origen.If the Label is not set to a custom ContentTemplate value, replace the Label with a TextBlock and data bind its Text property to the source string.

Propiedad enlazada a datosData bound property Tiempo de actualización (ms)Update time (ms)
Label.ContentLabel.Content 835835
TextBlock.TextTextBlock.Text 242242

El objeto Hyperlink es un elemento de contenido dinámico de nivel insertado que permite hospedar hipervínculos dentro del contenido dinámico.The Hyperlink object is an inline-level flow content element that allows you to host hyperlinks within the flow content.

Puede optimizar el uso de varios elementos Hyperlink si los agrupa juntos dentro de la misma TextBlock.You can optimize the use of multiple Hyperlink elements by grouping them together within the same TextBlock. Esto ayuda a minimizar el número de objetos que crea en la aplicación.This helps to minimize the number of objects you create in your application. Por ejemplo, es posible que quiera mostrar varios hipervínculos, como los siguientes:For example, you may want to display multiple hyperlinks, such as the following:

MSN inicio | Mi MSNMSN Home | My MSN

En el ejemplo de marcación siguiente se muestran varios elementos TextBlock usados para mostrar los hipervínculos:The following markup example shows multiple TextBlock elements used to display the hyperlinks:

<!-- 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>

En el ejemplo de marcación siguiente se muestra una manera más eficaz de mostrar los hipervínculos, esta vez, con un solo TextBlock:The following markup example shows a more efficient way of displaying the hyperlinks, this time, using a single 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>

Un objeto TextDecoration es un adorno visual que se puede Agregar al texto; sin embargo, el rendimiento puede ser intensivo en la creación de instancias.A TextDecoration object is a visual ornamentation that you can add to text; however, it can be performance intensive to instantiate. Si hace un uso intensivo de los elementos de Hyperlink, considere la posibilidad de mostrar un subrayado solo al desencadenar un evento, como el evento MouseEnter.If you make extensive use of Hyperlink elements, consider showing an underline only when triggering an event, such as the MouseEnter event. Para obtener más información, consulte Especificar el subrayado de un hipervínculo.For more information, see Specify Whether a Hyperlink is Underlined.

En la imagen siguiente se muestra cómo el evento MouseEnter desencadena el hipervínculo subrayado:The following image shows how the MouseEnter event triggers the underlined hyperlink:

Hipervínculos que muestran TextDecorations

En el ejemplo de marcado siguiente se muestra un Hyperlink definido con y sin subrayado:The following markup sample shows a Hyperlink defined with and without an underline:

<!-- 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>

En la tabla siguiente se muestra el costo de rendimiento de mostrar 1000 elementos Hyperlink con y sin subrayado.The following table shows the performance cost of displaying 1000 Hyperlink elements with and without an underline.

HyperlinkHyperlink Tiempo de creación (ms)Creation time (ms) Tiempo de representación (ms)Render time (ms)
Con subrayadoWith underline 289289 11301130
Sin subrayadoWithout underline 299299 776776

Características de formato de textoText Formatting Features

WPFWPF proporciona servicios de formato de texto enriquecido, como la división de palabras automática.provides rich text formatting services, such as automatic hyphenations. Estos servicios pueden afectar al rendimiento de la aplicación y solo deben usarse cuando sea necesario.These services may impact application performance and should only be used when needed.

Evitar el uso innecesario de la división de palabrasAvoid Unnecessary Use of Hyphenation

La división de palabras automática busca puntos de interrupción de guiones para líneas de texto y permite posiciones de salto adicionales para las líneas de TextBlock y FlowDocument objetos.Automatic hyphenation finds hyphen breakpoints for lines of text, and allows additional break positions for lines in TextBlock and FlowDocument objects. De forma predeterminada, la característica de división de palabras automática está deshabilitada en estos objetos.By default, the automatic hyphenation feature is disabled in these objects. Puede habilitarla si establece la propiedad IsHyphenationEnabled del objeto en true.You can enable this feature by setting the object's IsHyphenationEnabled property to true. Sin embargo, la habilitación de esta característica hace que WPFWPF inicie la interoperabilidad del modelo de objetos componentes (COM), lo que puede afectar al rendimiento de la aplicación.However, enabling this feature causes WPFWPF to initiate Component Object Model (COM) interoperability, which can impact application performance. Se recomienda que no se la división de palabras automática a menos que lo necesite.It is recommended that you do not use automatic hyphenation unless you need it.

Usar figuras con cuidadoUse Figures Carefully

Un elemento Figure representa una parte del contenido dinámico que puede tener una posición absoluta dentro de una página de contenido.A Figure element represents a portion of flow content that can be absolutely-positioned within a page of content. En algunos casos, un Figure puede hacer que una página completa cambie de formato automáticamente si su posición entra en conflicto con el contenido que ya se ha diseñado. Puede minimizar la posibilidad de volver a formatear innecesariamente agrupando Figure elementos uno tras otro o declarándolos cerca de la parte superior del contenido en un escenario de tamaño de página fijo.In some cases, a Figure may cause an entire page to automatically reformat if its position collides with content that has already been laid-out. You can minimize the possibility of unnecessary reformatting by either grouping Figure elements next to each other, or declaring them near the top of content in a fixed page size scenario.

Párrafo óptimoOptimal Paragraph

La característica de párrafo óptimo del objeto FlowDocument coloca los párrafos para que el espacio en blanco se distribuya lo más uniformemente posible.The optimal paragraph feature of the FlowDocument object lays out paragraphs so that white space is distributed as evenly as possible. De forma predeterminada, la característica de párrafo óptimo está deshabilitada.By default, the optimal paragraph feature is disabled. Puede habilitar esta característica estableciendo la propiedad IsOptimalParagraphEnabled del objeto en true.You can enable this feature by setting the object's IsOptimalParagraphEnabled property to true. Sin embargo, habilitar esta característica afecta al rendimiento de la aplicación.However, enabling this feature impacts application performance. Se recomienda que no use la característica de párrafo óptimo a menos que la necesite.It is recommended that you do not use the optimal paragraph feature unless you need it.

Vea tambiénSee also