Optimisation des performances: TextOptimizing Performance: Text

WPFWPF prend en charge la présentation de contenu de texte par le biais de l’utilisation de contrôles interface utilisateur (UI)user interface (UI) avec de nombreuses fonctionnalités.includes support for the presentation of text content through the use of feature-rich interface utilisateur (UI)user interface (UI) controls. En général, vous pouvez diviser le rendu du texte en trois couches :In general you can divide text rendering in three layers:

  1. Utilisation directe Glyphs des GlyphRun objets et.Using the Glyphs and GlyphRun objects directly.

  2. À l' FormattedText aide de l’objet.Using the FormattedText object.

  3. À l’aide de contrôles de haut niveau, TextBlock tels FlowDocument que les objets et.Using high-level controls, such as the TextBlock and FlowDocument objects.

Cette rubrique fournit des recommandations relatives aux performances de rendu de texte.This topic provides text rendering performance recommendations.

Rendu de texte au niveau du glypheRendering Text at the Glyph Level

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)fournit une prise en charge de texte avancée, notamment le balisage Glyphs au niveau du glyphe avec un accès direct à pour les clients qui souhaitent intercepter et conserver du texte après la mise en forme.provides advanced text support including glyph-level markup with direct access to Glyphs for customers who want to intercept and persist text after formatting. Ces fonctionnalités assurent une prise en charge critique pour les différentes spécifications de rendu de texte propres à chacun des scénarios suivants.These features provide critical support for the different text rendering requirements in each of the following scenarios.

  • Affichage à l’écran de documents de format fixe.Screen display of fixed-format documents.

  • Scénarios d’impression.Print scenarios.

    • langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML) comme langage d’imprimante.as a device printer language.

    • Microsoft XPS document Writer.Microsoft XPS Document Writer.

    • Pilotes d’imprimante précédents, sortie d’applications Win32Win32 au format fixe.Previous printer drivers, output from Win32Win32 applications to the fixed format.

    • Format de spouleur d’impression.Print spool format.

  • Représentation de document de format fixe, y compris les clients des versions antérieures de Windows et d’autres appareils informatiques.Fixed-format document representation, including clients for previous versions of Windows and other computing devices.

Notes

Glyphset GlyphRun sont conçus pour des scénarios de présentation et d’impression de documents de format fixe.Glyphs and GlyphRun are designed for fixed-format document presentation and print scenarios. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)fournit plusieurs éléments pour la mise en interface utilisateur (UI)user interface (UI) page générale et Label les TextBlockscénarios tels que et.provides several elements for general layout and interface utilisateur (UI)user interface (UI) scenarios such as Label and TextBlock. Pour plus d’informations sur les scénarios de disposition et d’Interface utilisateurUI, consultez Typographie dans WPF.For more information on layout and Interface utilisateurUI scenarios, see the Typography in WPF.

Les exemples suivants montrent comment définir les propriétés d’un Glyphs objet dans langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML).The following examples show how to define properties for a Glyphs object in langage XAML (eXtensible Application Markup Language)Extensible Application Markup Language (XAML). L' Glyphs objet représente la sortie d’un GlyphRun dans XAMLXAML.The Glyphs object represents the output of a GlyphRun in XAMLXAML. Ces exemples supposent que les polices Arial, Courrier New et Times New Roman sont installées dans le dossier C:\WINDOWS\Fonts sur l’ordinateur 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>

Utilisation de DrawGlyphRunUsing DrawGlyphRun

Si vous avez un contrôle personnalisé et que vous souhaitez restituer des glyphes DrawGlyphRun , utilisez la méthode.If you have custom control and you want to render glyphs, use the DrawGlyphRun method.

WPFWPFfournit également des services de niveau inférieur pour la mise en forme de texte personnalisée par FormattedText le biais de l’utilisation de l’objet.also provides lower-level services for custom text formatting through the use of the FormattedText object. La méthode la plus efficace pour afficher du Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) texte dans est de générer du contenu de texte au Glyphs niveau GlyphRundu glyphe à l’aide de et de.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. Toutefois, le coût de cette efficacité est la perte d’une mise en forme de texte enrichi facile à utiliser, qui sont des fonctionnalités Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) intégrées de contrôles, TextBlock telles FlowDocumentque et.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.

Objet FormattedTextFormattedText Object

L' FormattedText objet vous permet de dessiner du texte multiligne, dans lequel chaque caractère du texte peut être mis en forme individuellement.The FormattedText object allows you to draw multi-line text, in which each character in the text can be individually formatted. Pour plus d'informations, consultez Dessin du texte mis en forme.For more information, see Drawing Formatted Text.

Pour créer du texte mis en forme FormattedText , appelez le constructeur FormattedText pour créer un objet.To create formatted text, call the FormattedText constructor to create a FormattedText object. Une fois que vous avez créé la chaîne initiale de texte mis en forme, vous pouvez appliquer différents styles de mise en forme.Once you have created the initial formatted text string, you can apply a range of formatting styles. Si votre application souhaite implémenter sa propre disposition, l' FormattedText objet est mieux adapté à l’utilisation d’un contrôle, tel que. TextBlockIf your application wants to implement its own layout, then the FormattedText object is better choice than using a control, such as TextBlock. Pour plus d’informations sur FormattedText l’objet, consultez dessin du texte mis en forme .For more information on the FormattedText object, see Drawing Formatted Text .

L' FormattedText objet fournit une fonctionnalité de mise en forme du texte de bas niveau.The FormattedText object provides low-level text formatting capability. Vous pouvez appliquer plusieurs styles de mise en forme à un ou plusieurs caractères.You can apply multiple formatting styles to one or more characters. Par exemple, vous pouvez appeler SetFontSize les méthodes et SetForegroundBrush pour modifier la mise en forme des cinq premiers caractères du texte.For example, you could call both the SetFontSize and SetForegroundBrush methods to change the formatting of the first five characters in the text.

L’exemple de code suivant crée FormattedText un objet et le rend.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

Contrôles FlowDocument, TextBlock et LabelFlowDocument, TextBlock, and Label Controls

WPFWPF inclut plusieurs contrôles pour dessiner le texte à l’écran.includes multiple controls for drawing text to the screen. Chaque contrôle cible un scénario différent et dispose de sa propre liste de fonctionnalités et limitations.Each control is targeted to a different scenario and has its own list of features and limitations.

FlowDocument influe davantage sur les performances que TextBlock ou LabelFlowDocument Impacts Performance More than TextBlock or Label

En général, l' TextBlock élément doit être utilisé quand une prise en charge de texte limitée est nécessaire, par exemple une interface utilisateur (UI)user interface (UI)courte phrase dans un.In general, the TextBlock element should be used when limited text support is required, such as a brief sentence in a interface utilisateur (UI)user interface (UI). Labelpeut être utilisé quand une prise en charge minimale du texte est requise.Label can be used when minimal text support is required. L' FlowDocument élément est un conteneur pour les documents refluides qui prennent en charge la présentation enrichie de contenu et, par conséquent, a un impact TextBlock accru Label sur les performances par rapport à l’utilisation des contrôles ou.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.

Pour plus d’informations FlowDocumentsur, consultez vue d’ensemble des documents dynamiques.For more information on FlowDocument, see Flow Document Overview.

Éviter l’utilisation de TextBlock dans FlowDocumentAvoid Using TextBlock in FlowDocument

L' TextBlock élément est dérivé de UIElement.The TextBlock element is derived from UIElement. L' Run élément est dérivé de TextElement, ce qui est moins coûteux à utiliser qu' UIElementun objet dérivé de.The Run element is derived from TextElement, which is less costly to use than a UIElement-derived object. Lorsque cela est possible Run , utilisez TextBlock plutôt que pour afficher le contenu FlowDocumentde texte dans un.When possible, use Run rather than TextBlock for displaying text content in a FlowDocument.

L’exemple de balisage suivant illustre deux façons de définir le contenu de FlowDocumenttexte dans un: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>

Éviter l’utilisation de Run pour définir des propriétés de texteAvoid Using Run to Set Text Properties

En général, l’utilisation Run d’un TextBlock dans un est plus gourmande en performances que Run l’utilisation d’un objet explicite.In general, using a Run within a TextBlock is more performance intensive than not using an explicit Run object at all. Si vous utilisez un Run pour définir des propriétés de texte, définissez ces propriétés directement sur le à la TextBlock place.If you are using a Run in order to set text properties, set those properties directly on the TextBlock instead.

L’exemple de balisage suivant illustre ces deux méthodes de définition d’une propriété de texte, dans ce FontWeight cas, la propriété: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>

Le tableau suivant montre le coût de l’affichage TextBlock des objets 1000 avec et sans RunExplicit.The following table shows the cost of displaying 1000 TextBlock objects with and without an explicit Run.

Type de TextBlockTextBlock type Durée de création (ms)Creation time (ms) Durée d’affichage (ms)Render time (ms)
Utilisation de Run pour définir des propriétés de texteRun setting text properties 146146 540540
Utilisation de TextBlock pour définir des propriétés de texteTextBlock setting text properties 4343 453453

Éviter la liaison de données à la propriété Label.ContentAvoid Databinding to the Label.Content Property

Imaginez un scénario dans lequel vous disposez Label d’un objet qui est fréquemment mis String à jour à partir d’une source.Imagine a scenario where you have a Label object that is updated frequently from a String source. Lorsque des données lient Label la propriété Content de l’élément String à l’objet source, vous pouvez constater des performances médiocres.When data binding the Label element's Content property to the String source object, you may experience poor performance. Chaque fois que la String source est mise à jour String , l’ancien objet est supprimé et un String nouveau est recréé, car un String objet est immuable et ne peut pas être modifié.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. Cela entraîne, à son tour, ContentPresenter la suppression Label de son ancien contenu par le de l’objet et la régénération du nouveau contenu Stringpour afficher le nouveau.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 solution à ce problème est simple.The solution to this problem is simple. Text TextBlock Label ContentTemplate Si n’est pas défini sur une valeur personnalisée, remplacez le par un et liez sa propriété à la chaîne source. LabelIf 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.

Propriété liée aux donnéesData bound property Durée de la mise à jour (ms)Update time (ms)
Label.ContentLabel.Content 835835
TextBlock.TextTextBlock.Text 242242

L' Hyperlink objet est un élément de contenu de workflow au niveau de la ligne qui vous permet d’héberger des liens hypertexte dans le contenu dynamique.The Hyperlink object is an inline-level flow content element that allows you to host hyperlinks within the flow content.

Vous pouvez optimiser l’utilisation de plusieurs Hyperlink éléments en les regroupant dans le même TextBlock.You can optimize the use of multiple Hyperlink elements by grouping them together within the same TextBlock. De cette façon, vous réduisez le nombre d’objets à créer dans votre application.This helps to minimize the number of objects you create in your application. Par exemple, vous pouvez afficher plusieurs liens hypertexte, comme suit :For example, you may want to display multiple hyperlinks, such as the following:

Page d’accueil MSN | Mon MSNMSN Home | My MSN

L’exemple de balisage suivant TextBlock montre plusieurs éléments utilisés pour afficher les liens hypertexte: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’exemple de balisage suivant montre un moyen plus efficace d’afficher les liens hypertexte, cette fois, à l' TextBlockaide d’un seul: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 TextDecoration objet est un ornement visuel que vous pouvez ajouter à du texte. Toutefois, il peut s’agir d’une utilisation intensive des performances pour instancier.A TextDecoration object is a visual ornamentation that you can add to text; however, it can be performance intensive to instantiate. Si vous utilisez beaucoup d' Hyperlink éléments, envisagez d’afficher un soulignement uniquement lors du déclenchement d’un événement, tel que l' MouseEnter événement.If you make extensive use of Hyperlink elements, consider showing an underline only when triggering an event, such as the MouseEnter event. Pour plus d’informations, consultez Spécifier si un lien hypertexte est souligné ou non.For more information, see Specify Whether a Hyperlink is Underlined.

L’illustration suivante montre comment l’événement MouseEnter déclenche le lien hypertexte souligné:The following image shows how the MouseEnter event triggers the underlined hyperlink:

Liens hypertexte affichant TextDecorations

L’exemple de balisage suivant Hyperlink montre un défini avec et sans soulignement: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>

Le tableau suivant indique le coût des performances de l' Hyperlink affichage de 1000 éléments avec et sans soulignement.The following table shows the performance cost of displaying 1000 Hyperlink elements with and without an underline.

Lien hypertexteHyperlink Durée de création (ms)Creation time (ms) Durée d’affichage (ms)Render time (ms)
Avec soulignementWith underline 289289 11301130
Sans soulignementWithout underline 299299 776776

Fonctionnalités de mise en forme du texteText Formatting Features

WPFWPF fournit des services de mise en forme de texte enrichi, comme la coupure de mots automatique.provides rich text formatting services, such as automatic hyphenations. Ces services peuvent affecter les performances de l’application et doivent être utilisés uniquement si nécessaire.These services may impact application performance and should only be used when needed.

Éviter l’utilisation inutile de la coupure de motsAvoid Unnecessary Use of Hyphenation

La césure automatique détecte les points d’arrêt de trait d’Union pour les lignes de texte et autorise TextBlock des FlowDocument positions de rupture supplémentaires pour les lignes dans les objets et.Automatic hyphenation finds hyphen breakpoints for lines of text, and allows additional break positions for lines in TextBlock and FlowDocument objects. Par défaut, la fonctionnalité de coupure de mots automatique est désactivée dans ces objets.By default, the automatic hyphenation feature is disabled in these objects. Vous pouvez activer cette fonctionnalité en définissant la propriété IsHyphenationEnabled de l’objet sur true.You can enable this feature by setting the object's IsHyphenationEnabled property to true. Toutefois, l’activation de cette WPFWPF fonctionnalité entraîne l’initiation de l’interopérabilité COM (Component Object Model), ce qui peut avoir un impact sur les performances de l’application.However, enabling this feature causes WPFWPF to initiate Component Object Model (COM) interoperability, which can impact application performance. Nous vous recommandons de ne pas utiliser la coupure de mots automatique, sauf si vous en avez besoin.It is recommended that you do not use automatic hyphenation unless you need it.

Utiliser les figures avec précautionUse Figures Carefully

Un Figure élément représente une partie du contenu dynamique qui peut être positionnée de manière absolue dans une page de contenu.A Figure element represents a portion of flow content that can be absolutely-positioned within a page of content. Dans certains cas, un Figure peut entraîner la remise en forme automatique d’une page entière si sa position est en conflit avec du contenu qui a déjà été disposé. Vous pouvez réduire la possibilité d’un reformatage inutile en regroupant Figure les éléments les uns à côté des autres ou en les déclarant vers le haut du contenu dans un scénario de taille de page fixe.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.

Paragraphe optimalOptimal Paragraph

La fonctionnalité de paragraphe optimal de FlowDocument l’objet dispose des paragraphes afin que l’espace blanc soit distribué aussi uniformément que possible.The optimal paragraph feature of the FlowDocument object lays out paragraphs so that white space is distributed as evenly as possible. Par défaut, la fonctionnalité de paragraphe optimal est désactivée.By default, the optimal paragraph feature is disabled. Vous pouvez activer cette fonctionnalité en affectant à IsOptimalParagraphEnabled truela propriété de l’objet la valeur.You can enable this feature by setting the object's IsOptimalParagraphEnabled property to true. Toutefois, l’activation de cette fonctionnalité affecte les performances de l’application.However, enabling this feature impacts application performance. Nous vous recommandons de ne pas utiliser la fonctionnalité de paragraphe optimal, sauf si vous en avez besoin.It is recommended that you do not use the optimal paragraph feature unless you need it.

Voir aussiSee also