Optimisation des performances : texte

Mise à jour : novembre 2007

WPF inclut la prise en charge pour la présentation de contenu de texte à travers l'utilisation de contrôles interface utilisateur (UI) riches en fonctionnalités. En général vous pouvez diviser le rendu de texte en trois couches :

  1. En utilisant directement les objets Glyphs et GlyphRun.

  2. En utilisant l'objet FormattedText.

  3. En utilisant des contrôles de niveau supérieur, tels que les objets TextBlock et FlowDocument.

Cette rubrique fournit des recommandations de performance concernant le rendu de texte.

Cette rubrique comprend les sections suivantes.

  • Rendu de texte au niveau du glyphe
  • Objet FormattedText
  • Contrôles FlowDocument, TextBlock et Label
  • Lien hypertexte
  • Fonctionnalités de mise en forme de texte
  • Rubriques connexes

Rendu de texte au niveau du glyphe

Windows Presentation Foundation (WPF) fournit une prise en charge de texte avancée comprenant une balise de niveau glyphe avec accès direct au Glyphs pour les clients qui souhaitent intercepter et rendre le texte persistant après la mise en forme. Ces fonctionnalités fournissent une prise en charge critique pour les différentes conditions de rendu de texte requises dans chacun des scénarios suivants.

  • Affichage sur écran de documents à format fixe.

  • Scénarios d'impression.

    • XAML (Extensible Application Markup Language) comme langage du périphérique d'impression.

    • Microsoft XPS Document Writer.

    • Les pilotes d'imprimante précédents, sortie d'applications Win32 au format fixe.

    • Format d'impression de spoule.

  • Représentation de document à format fixe, y compris les clients des versions antérieures de Windows et d'autres périphériques informatiques.

Remarque :

Glyphs et GlyphRun sont conçus pour la présentation de document à format fixe et les scénarios d'impression. Windows Presentation Foundation (WPF) fournit plusieurs éléments pour la présentation générale et les scénarios interface utilisateur (UI) tels que Label et TextBlock. Pour plus d'informations sur la présentation et les scénarios interface utilisateur, consultez Typographie dans Windows Presentation Foundation.

Les exemples suivants indiquent comment définir des propriétés pour un objet Glyphs en XAML (Extensible Application Markup Language). L'objet Glyphs représente la sortie de GlyphRun en XAML. Les 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 example shows how to use a Glyphs object. -->
<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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 DrawGlyphRun

Si vous avez le contrôle personnalisé et que vous souhaitez restituer des glyphes, utilisez la méthode DrawGlyphRun.

WPF fournit également des services de niveau inférieur pour la mise en forme de texte personnalisée à travers l'utilisation de l'objet FormattedText. La façon la plus efficace de rendu du texte dans Windows Presentation Foundation (WPF) est de générer le contenu de texte au niveau du glyphe à l'aide de Glyphs et de GlyphRun. Toutefois, le coût de ce rendement est la perte de la facilité d'utilisation de la mise en forme du texte enrichi, qui sont des fonctionnalités intégrées de contrôles Windows Presentation Foundation (WPF), tels que TextBlock et FlowDocument.

Objet FormattedText

L'objet FormattedText vous permet de dessiner du texte multiligne, dans lequel chaque caractère du texte peut être mis en forme individuellement. Pour plus d'informations, consultez Dessin du texte mis en forme.

Pour créer le texte mis en forme, appelez le constructeur FormattedText pour créer un objet FormattedText. Une fois que vous avez créé la chaîne de texte mis en forme initiale, vous pouvez appliquer une plage de mises en forme de styles. Si votre application souhaite implémenter sa propre présentation, l'objet FormattedText est alors un meilleur choix que d'utiliser un contrôle tel que TextBlock. Pour plus d'informations sur l'objet FormattedText, consultez Dessin du texte mis en forme.

L'objet FormattedText fournit la fonction de mise en forme du texte de bas niveau. Vous pouvez appliquer plusieurs styles de mise en forme à un ou plusieurs caractères. Par exemple, vous pourriez appeler à la fois les méthodes SetFontSize et SetForegroundBrush pour modifier la mise en forme des cinq premiers caractères dans le texte.

L'exemple de code suivant crée un objet FormattedText et le restitue.

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));
}

Contrôles FlowDocument, TextBlock et Label

WPF inclut plusieurs contrôles pour dessiner le texte à l'écran. Chaque contrôle est ciblé pour un scénario différent et dispose de sa propre liste de fonctionnalités et limitations.

L'impact de FlowDocument sur les performances est plus important qu'avec TextBlock ou Label

En général, l'élément TextBlock doit être utilisé lorsque la prise en charge de texte limitée est requise, telle qu'une phrase courte dans un interface utilisateur (UI). Label peut être utilisé quand la prise en charge de texte minimale est requise. L'élément FlowDocument est un conteneur pour les documents de reflux qui prennent en charge la présentation enrichie de contenu, et par conséquent, a un impact sur les performances supérieur à l'utilisation des contrôlesTextBlock ou Label.

Pour plus d'informations sur FlowDocument, consultez Vue d'ensemble des documents dynamiques.

Évitez d'utiliser TextBlock dans FlowDocument

L'élément TextBlock est dérivé de UIElement. L'élément Run est dérivé de TextElement, qui revient moins cher à utiliser qu'un objet UIElement dérivé. Lorsque cela est possible, utilisez Run plutôt que TextBlock pour afficher le contenu de texte dans un FlowDocument.

L'exemple de balise suivant illustre deux façons de définir du contenu de texte dans un 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>

Évitez d'utiliser Exécuter pour définir les propriétés de texte

En général, l'utilisation d'un Run dans un TextBlock est plus intensif en terme de performance que de ne pas utiliser d'objet Run du tout. Si vous utilisez un Run pour définir des propriétés de texte, définissez à la place des propriétés directement sur le TextBlock.

L'exemple de balise suivant illustre ces deux façons de définir une propriété texte, dans ce cas, la propriété 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>

La table suivante affiche le coût de l'affichage de 1000 objets TextBlock avec et sans un Run explicite.

Type TextBlock

Heure de création (ms)

Restituer l'heure (ms)

Exécuter le paramétrage des propriétés de texte

146

540

Propriétés texte de paramètre TextBlock

43

453

Éviter la liaison de données à la propriété Label.Content

Imaginez un scénario où vous avez un objet Label qui est fréquemment mis à jour d'une source String. Lors de la liaison de données de la propriété Content de l'élément Label à l'objet source String, vous pouvez rencontrer des performances médiocres. Chaque fois que la source String est mise à jour, l'ancien objet String est ignoré et un nouveau String est créé. Du fait qu'un objet String est immuable, il ne peut pas être modifié. Cela, en revanche, entraîne le ContentPresenter de l'objet Label à ignorer son ancien contenu et à régénérer le nouveau contenu pour afficher le nouveau String.

La solution à ce problème est simple. Si le Label n'a pas de valeur ContentTemplate personnalisée, remplacez le Label par un TextBlock et liez les données de sa propriété Text à la chaîne source.

Propriété liée aux données

Mettre à jour l'heure (ms)

Label.Content

835

TextBlock.Text

242

Lien hypertexte

L'objet Hyperlink est un élément inclus de contenu de flux qui vous permet d'héberger des liens hypertexte au sein du contenu de flux.

Combiner des liens hypertexte dans un objet TextBlock

Vous pouvez optimiser l'utilisation de plusieurs éléments Hyperlink en les groupant ensemble dans le même TextBlock. Cela aide à réduire le nombre d'objets que vous créez dans votre application. Par exemple, vous pouvez afficher plusieurs liens hypertexte, tels que les éléments suivants :

MSN Home | My MSN

L'exemple de balise suivant affiche plusieurs éléments TextBlock utilisés pour afficher les liens hypertexte :

<!-- Hyperlinks in separate TextBlocks. -->
<TextBlock>
  <Hyperlink TextDecorations="None" NavigateUri="https://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 balise suivant montre une façon plus efficace d'afficher des liens hypertexte, en utilisant cette fois-ci un TextBlock unique :

<!-- Hyperlinks combined in the same TextBlock. -->
<TextBlock>
  <Hyperlink TextDecorations="None" NavigateUri="https://www.msn.com">MSN Home</Hyperlink>

  <Run Text=" | " />

  <Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>
</TextBlock>

Affichage des soulignements sur les liens hypertexte sur les événements MouseEnter uniquement

Un objet TextDecoration est une ornementation visuelle que vous pouvez ajouter au texte ; toutefois, ce peut s'avérer intensif à instancier en terme de performance. Si vous utilisez beaucoup d'éléments Hyperlink, envisagez d'afficher un soulignement uniquement lors du déclenchement d'un événement, tel que l'événement MouseEnter. Pour plus d'informations, consultez Comment : utiliser une décoration de texte avec un lien hypertexte.

Lien hypertexte qui apparaît sur MouseEnter

Liens hypertexte affichant TextDecorations

L'exemple de balise suivant affiche un Hyperlink défini avec et sans soulignement :

<!-- Hyperlink with default underline. -->
<Hyperlink NavigateUri="https://www.msn.com">
  MSN Home
</Hyperlink>

<Run Text=" | " />

<!-- Hyperlink with no underline. -->
<Hyperlink Name="myHyperlink" TextDecorations="None"
           MouseEnter="OnMouseEnter"
           MouseLeave="OnMouseLeave"
           NavigateUri="https://www.msn.com">
  My MSN
</Hyperlink>

La table suivante affiche le coût de performance de l'affichage de 1000 éléments Hyperlink avec et sans soulignement.

Lien hypertexte

Heure de création (ms)

Restituer l'heure (ms)

Avec soulignement

289

1130

Sans soulignement

299

776

Fonctionnalités de mise en forme de texte

WPF fournit des services de mise en forme de texte enrichi, tels que les coupures de mots automatiques. Ces services peuvent avoir un impact sur les performances de l'application et doivent être utilisé uniquement en cas de besoin.

Évitez l'utilisation inutile de coupures de mots

La coupure de mots automatique recherche des points d'arrêt de trait d'union pour des lignes de texte, et autorise des positions d'arrêt supplémentaires pour les lignes des objets TextBlock et FlowDocument. Par défaut, la fonctionnalité de coupure de mots automatique est désactivée dans ces objets. Vous pouvez activer cette fonction en définissant la propriété IsHyphenationEnabled de l'objet à la valeur true. Toutefois, l'activation de cette fonction entraîne WPF à démarrer l'interopérabilité COM (Component Object Model), ce qui peut avoir un impact sur les performances de l'application. Il est recommandé de n'utiliser la coupure de mots automatique qu'en cas de besoin.

Utilisez les figures avec précaution

Un élément Figure représente une partie de contenu de flux qui peut être positionné de manière absolue dans une page de contenu. Dans certains cas, une Figure peut entraîner la remise en forme automatique complète d'une page entière, si sa position est en conflit avec le contenu qui a déjà été disposé. Vous pouvez minimiser la possibilité d'une remise en forme inutile en regroupant les éléments Figure situés à côté l'un de l'autre, ou en les déclarant près du haut du contenu dans un scénario de la taille de page fixe.

Paragraphe optimal

La fonctionnalité de paragraphe optimal de l'objet FlowDocument dispose les paragraphes afin que les espaces vides soient distribués de la façon la plus homogène possible. Par défaut, la fonctionnalité de paragraphe optimal est désactivée. Vous pouvez l'activer en définissant la propriété IsOptimalParagraphEnabled de l'objet à la valeur true. Toutefois, l'activation de cette fonction a un impact sur les performances de l'application. Il est recommandé de n'utiliser la fonctionnalité de paragraphe optimal qu'en cas de besoin.

Voir aussi

Concepts

Optimisation des performances des applications WPF

Planification des performances des applications

Optimisation des performances : tirer parti du matériel

Optimisation des performances : disposition et conception

Optimisation des performances : graphiques 2D et acquisition d'images

Optimisation des performances : comportement d'objets

Optimisation des performances : ressources d'application

Optimisation des performances : liaison de données

Optimisation des performances : autres recommandations

Ressources et outils d'analyse des performances WPF