Ottimizzazione delle prestazioni: testoOptimizing Performance: Text

WPFWPF include il supporto per la presentazione di contenuto di testo tramite l'uso di controlli avanzati della interfaccia utenteuser interface (UI).includes support for the presentation of text content through the use of feature-rich interfaccia utenteuser interface (UI) controls. In generale, è possibile suddividere il rendering del testo in tre livelli:In general you can divide text rendering in three layers:

  1. Utilizzando direttamente gli oggetti Glyphs e GlyphRun.Using the Glyphs and GlyphRun objects directly.

  2. Utilizzando l'oggetto FormattedText.Using the FormattedText object.

  3. Uso di controlli di alto livello, ad esempio gli oggetti TextBlock e FlowDocument.Using high-level controls, such as the TextBlock and FlowDocument objects.

Questo argomento offre utili suggerimenti sulle prestazioni del rendering del testo.This topic provides text rendering performance recommendations.

Rendering del testo a livello di glifoRendering Text at the Glyph Level

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) offre supporto avanzato per il testo, incluso il markup a livello di glifo, con accesso diretto ai Glyphs per i clienti che desiderano intercettare e mantenere il testo dopo la formattazione.provides advanced text support including glyph-level markup with direct access to Glyphs for customers who want to intercept and persist text after formatting. Queste funzionalità forniscono il supporto fondamentale per i diversi requisiti di rendering del testo in ognuno degli scenari seguenti.These features provide critical support for the different text rendering requirements in each of the following scenarios.

  • Visualizzazione di documenti a formato fisso.Screen display of fixed-format documents.

  • Scenari di stampa.Print scenarios.

    • Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) come linguaggio della stampante.as a device printer language.

    • Microsoft XPS Document Writer.Microsoft XPS Document Writer.

    • Driver della stampante precedenti, output delle applicazioni Win32 nel formato fisso.Previous printer drivers, output from Win32 applications to the fixed format.

    • Formato dello spooling di stampa.Print spool format.

  • Rappresentazione di documenti a formato fisso, inclusi i client per le versioni precedenti di Windows e altri dispositivi di elaborazione.Fixed-format document representation, including clients for previous versions of Windows and other computing devices.

Nota

Glyphs e GlyphRun sono progettati per scenari di presentazione e stampa di documenti a formato fisso.Glyphs and GlyphRun are designed for fixed-format document presentation and print scenarios. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) fornisce diversi elementi per il layout generale e scenari di interfaccia utenteuser interface (UI), ad esempio Label e TextBlock.provides several elements for general layout and interfaccia utenteuser interface (UI) scenarios such as Label and TextBlock. Per altre informazioni sugli scenari di layout e dell'Interfaccia utenteUI, vedere Funzionalità tipografiche di WPF.For more information on layout and Interfaccia utenteUI scenarios, see the Typography in WPF.

Negli esempi seguenti viene illustrato come definire le proprietà per un oggetto Glyphs in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML).The following examples show how to define properties for a Glyphs object in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML). L'oggetto Glyphs rappresenta l'output di un GlyphRun in XAMLXAML.The Glyphs object represents the output of a GlyphRun in XAMLXAML. Negli esempi si presuppone che i tipi di carattere Arial, Courier New e Times New Roman siano installati nella cartella C:\WINDOWS\Fonts nel computer locale.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>

Uso di DrawGlyphRunUsing DrawGlyphRun

Se si dispone di un controllo personalizzato e si desidera eseguire il rendering dei glifi, utilizzare il metodo DrawGlyphRun.If you have custom control and you want to render glyphs, use the DrawGlyphRun method.

WPFWPF fornisce anche servizi di livello inferiore per la formattazione di testo personalizzata tramite l'utilizzo dell'oggetto FormattedText.also provides lower-level services for custom text formatting through the use of the FormattedText object. Il modo più efficiente per eseguire il rendering del testo in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) consiste nel generare contenuto di testo a livello di glifo utilizzando Glyphs e 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. Tuttavia, il costo di questa efficienza è la perdita di una formattazione del testo RTF facile da usare, ovvero funzionalità predefinite dei controlli Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF), ad esempio TextBlock e 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.

Oggetto FormattedTextFormattedText Object

L'oggetto FormattedText consente di creare testo su più righe, in cui ogni carattere del testo può essere formattato singolarmente.The FormattedText object allows you to draw multi-line text, in which each character in the text can be individually formatted. Per altre informazioni, vedere Disegno di testo formattato.For more information, see Drawing Formatted Text.

Per creare un testo formattato, chiamare il costruttore FormattedText per creare un oggetto FormattedText.To create formatted text, call the FormattedText constructor to create a FormattedText object. Dopo aver creato la stringa di testo formattato iniziale, è possibile applicare una gamma di stili di formattazione.Once you have created the initial formatted text string, you can apply a range of formatting styles. Se l'applicazione desidera implementare il proprio layout, l'oggetto FormattedText è preferibile rispetto all'uso di un controllo, ad esempio TextBlock.If your application wants to implement its own layout, then the FormattedText object is better choice than using a control, such as TextBlock. Per ulteriori informazioni sull'oggetto FormattedText, vedere disegno di testo formattato .For more information on the FormattedText object, see Drawing Formatted Text .

L'oggetto FormattedText fornisce funzionalità di formattazione del testo di basso livello.The FormattedText object provides low-level text formatting capability. È possibile applicare vari stili di formattazione a uno o più caratteri.You can apply multiple formatting styles to one or more characters. È ad esempio possibile chiamare entrambi i metodi SetFontSize e SetForegroundBrush per modificare la formattazione dei primi cinque caratteri del testo.For example, you could call both the SetFontSize and SetForegroundBrush methods to change the formatting of the first five characters in the text.

Nell'esempio di codice seguente viene creato un oggetto FormattedText e ne viene eseguito il rendering.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

Controlli FlowDocument, TextBlock e LabelFlowDocument, TextBlock, and Label Controls

WPFWPF include più controlli per la creazione di testo sullo schermo.includes multiple controls for drawing text to the screen. Ogni controllo è destinato a uno scenario diverso e dispone di un proprio elenco di funzionalità e limitazioni.Each control is targeted to a different scenario and has its own list of features and limitations.

Un elemento FlowDocument influisce sulle prestazioni più di un elemento TextBlock o LabelFlowDocument Impacts Performance More than TextBlock or Label

In generale, l'elemento TextBlock deve essere utilizzato quando è necessario il supporto di testo limitato, ad esempio una breve frase in una interfaccia utenteuser interface (UI).In general, the TextBlock element should be used when limited text support is required, such as a brief sentence in a interfaccia utenteuser interface (UI). Label può essere utilizzato quando è richiesto un supporto di testo minimo.Label can be used when minimal text support is required. L'elemento FlowDocument è un contenitore per i documenti riflussi che supportano la presentazione dettagliata del contenuto e, di conseguenza, ha un maggiore effetto sulle prestazioni rispetto all'uso dei controlli 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.

Per altre informazioni su FlowDocument, vedere Cenni preliminari sui documenti dinamici.For more information on FlowDocument, see Flow Document Overview.

Evitare di usare TextBlock in FlowDocumentAvoid Using TextBlock in FlowDocument

L'elemento TextBlock deriva da UIElement.The TextBlock element is derived from UIElement. L'elemento Run deriva da TextElement, che è meno costoso da usare rispetto a un oggetto derivato da UIElement.The Run element is derived from TextElement, which is less costly to use than a UIElement-derived object. Quando possibile, usare Run anziché TextBlock per visualizzare il contenuto di testo in un FlowDocument.When possible, use Run rather than TextBlock for displaying text content in a FlowDocument.

L'esempio di markup seguente illustra due modi per impostare il contenuto di testo all'interno di 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>

Evitare di usare un oggetto Run per impostare proprietà di testoAvoid Using Run to Set Text Properties

In generale, l'uso di un Run all'interno di una TextBlock è più intenso rispetto all'uso di un oggetto Run esplicito.In general, using a Run within a TextBlock is more performance intensive than not using an explicit Run object at all. Se si utilizza una Run per impostare le proprietà del testo, impostare le proprietà direttamente nel TextBlock.If you are using a Run in order to set text properties, set those properties directly on the TextBlock instead.

Nell'esempio di markup seguente vengono illustrate queste due modalità di impostazione di una proprietà di testo, in questo caso la proprietà 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>

La tabella seguente mostra il costo della visualizzazione di 1000 TextBlock oggetti con e senza una Runesplicita.The following table shows the cost of displaying 1000 TextBlock objects with and without an explicit Run.

Tipo di TextBlockTextBlock type Tempo di creazione (ms)Creation time (ms) Tempo di rendering (ms)Render time (ms)
Proprietà di testo impostate con RunRun setting text properties 146146 540540
Proprietà di testo impostate con TextBlockTextBlock setting text properties 4343 453453

Evitare di eseguire il data binding alla proprietà Label.ContentAvoid Databinding to the Label.Content Property

Si immagini uno scenario in cui si dispone di un oggetto Label aggiornato di frequente da un'origine String.Imagine a scenario where you have a Label object that is updated frequently from a String source. Quando data binding la proprietà Content dell'elemento Label all'oggetto di origine String, è possibile che si verifichi una riduzione delle prestazioni.When data binding the Label element's Content property to the String source object, you may experience poor performance. Ogni volta che viene aggiornata la String di origine, l'oggetto String precedente viene eliminato e viene ricreato un nuovo String, perché un oggetto String non è modificabile e non può essere modificato.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. Questo, a sua volta, fa sì che il ContentPresenter dell'oggetto Label elimini il contenuto precedente e rigeneri il nuovo contenuto per visualizzare il nuovo 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 soluzione di questo problema è semplice.The solution to this problem is simple. Se il Label non è impostato su un valore ContentTemplate personalizzato, sostituire il Label con una TextBlock e associare i dati alla relativa proprietà Text nella stringa di origine.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.

Proprietà con data bindingData bound property Tempo di aggiornamento (ms)Update time (ms)
Label.ContentLabel.Content 835835
TextBlock.TextTextBlock.Text 242242

L'oggetto Hyperlink è un elemento di contenuto del flusso di livello inline che consente di ospitare collegamenti ipertestuali all'interno del contenuto del flusso.The Hyperlink object is an inline-level flow content element that allows you to host hyperlinks within the flow content.

È possibile ottimizzare l'utilizzo di più elementi Hyperlink raggruppando questi elementi all'interno della stessa TextBlock.You can optimize the use of multiple Hyperlink elements by grouping them together within the same TextBlock. In questo modo, è possibile ridurre al minimo il numero di oggetti creati nell'applicazione.This helps to minimize the number of objects you create in your application. È possibile, ad esempio, che si voglia visualizzare più collegamenti ipertestuali, come illustrato di seguito:For example, you may want to display multiple hyperlinks, such as the following:

Home page MSN | MSNMSN Home | My MSN

L'esempio di markup seguente mostra più elementi TextBlock utilizzati per visualizzare i collegamenti ipertestuali: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>

L'esempio di markup seguente mostra un modo più efficiente per visualizzare i collegamenti ipertestuali, questa volta usando una singola 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 oggetto TextDecoration è un ornamento visivo che è possibile aggiungere al testo; Tuttavia, può essere un'attività che richiede un utilizzo intensivo delle prestazioni.A TextDecoration object is a visual ornamentation that you can add to text; however, it can be performance intensive to instantiate. Se si utilizza in modo esteso gli elementi di Hyperlink, è consigliabile visualizzare una sottolineatura solo quando si attiva un evento, ad esempio l'evento MouseEnter.If you make extensive use of Hyperlink elements, consider showing an underline only when triggering an event, such as the MouseEnter event. Per altre informazioni, vedere Specificare se un collegamento ipertestuale è sottolineato.For more information, see Specify Whether a Hyperlink is Underlined.

Nell'immagine seguente viene illustrato il modo in cui l'evento MouseEnter attiva il collegamento ipertestuale sottolineato:The following image shows how the MouseEnter event triggers the underlined hyperlink:

Collegamenti ipertestuali con TextDecoration

Nell'esempio di markup seguente viene illustrato un Hyperlink definito con e senza sottolineatura: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>

La tabella seguente mostra il costo in termini di prestazioni della visualizzazione degli elementi di 1000 Hyperlink con e senza una sottolineatura.The following table shows the performance cost of displaying 1000 Hyperlink elements with and without an underline.

Collegamento ipertestualeHyperlink Tempo di creazione (ms)Creation time (ms) Tempo di rendering (ms)Render time (ms)
Con sottolineaturaWith underline 289289 11301130
Senza sottolineaturaWithout underline 299299 776776

Funzionalità di formattazione del testoText Formatting Features

WPFWPF fornisce servizi di formattazione RTF come le sillabazioni automatiche.provides rich text formatting services, such as automatic hyphenations. Questi servizi possono influire sulle prestazioni dell'applicazione e devono essere usati solo se strettamente necessario.These services may impact application performance and should only be used when needed.

Evitare l'uso non necessario della sillabazioneAvoid Unnecessary Use of Hyphenation

La sillabazione automatica trova i punti di interruzione del segno meno per le righe di testo e consente posizioni di interruzione aggiuntive per le linee in TextBlock e FlowDocument oggetti.Automatic hyphenation finds hyphen breakpoints for lines of text, and allows additional break positions for lines in TextBlock and FlowDocument objects. Per impostazione predefinita, la funzionalità di sillabazione automatica è disattivata in questi oggetti.By default, the automatic hyphenation feature is disabled in these objects. È possibile attivare questa funzionalità impostando la proprietà IsHyphenationEnabled dell'oggetto su true.You can enable this feature by setting the object's IsHyphenationEnabled property to true. Tuttavia, l'abilitazione di questa funzionalità comporta l'avvio dell'interoperabilità di Component Object Model (COM) da WPFWPF, che può influisce sulle prestazioni dell'applicazione.However, enabling this feature causes WPFWPF to initiate Component Object Model (COM) interoperability, which can impact application performance. È consigliabile quindi usare la sillabazione automatica solo se necessario.It is recommended that you do not use automatic hyphenation unless you need it.

Usare con attenzione gli elementi FigureUse Figures Carefully

Un elemento Figure rappresenta una parte di contenuto dinamico che può essere posizionata in modo assoluto all'interno di una pagina di contenuto.A Figure element represents a portion of flow content that can be absolutely-positioned within a page of content. In alcuni casi, una Figure può causare la riformattazione automatica di un'intera pagina se la posizione è in conflitto con il contenuto già definito. È possibile ridurre al minimo la possibilità di riformattazione non necessaria raggruppando gli elementi Figure uno accanto all'altro o dichiarando tali elementi nella parte superiore del contenuto in uno scenario di dimensioni di pagina fisse.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.

Paragrafo ottimaleOptimal Paragraph

La funzionalità di paragrafo ottimale dell'oggetto FlowDocument dispone i paragrafi, in modo che gli spazi vuoti vengano distribuiti nel modo più uniforme possibile.The optimal paragraph feature of the FlowDocument object lays out paragraphs so that white space is distributed as evenly as possible. Per impostazione predefinita, la funzionalità di paragrafo ottimale è disattivata.By default, the optimal paragraph feature is disabled. È possibile abilitare questa funzionalità impostando la proprietà IsOptimalParagraphEnabled dell'oggetto su true.You can enable this feature by setting the object's IsOptimalParagraphEnabled property to true. L'attivazione di questa funzionalità, tuttavia, influisce sulle prestazioni dell'applicazione.However, enabling this feature impacts application performance. È consigliabile quindi usare la funzionalità di paragrafo ottimale solo se necessario.It is recommended that you do not use the optimal paragraph feature unless you need it.

Vedere ancheSee also