Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
WPF inclut la prise en charge de la présentation du contenu texte via l’utilisation de contrôles d’interface utilisateur riches en fonctionnalités. En général, vous pouvez diviser le rendu du texte en trois couches :
Utilisation de l’objet FormattedText .
Utilisation de contrôles de haut niveau, tels que les objets TextBlock et FlowDocument.
Cette rubrique fournit des recommandations de performances de rendu de texte.
Rendu du texte au niveau du glyphe
Windows Presentation Foundation (WPF) fournit une prise en charge avancée du texte, y compris le balisage au niveau du glyphe avec un accès direct à Glyphs pour les clients qui souhaitent intercepter et conserver du texte après la mise en forme. Ces fonctionnalités prennent en charge les différentes exigences de rendu de texte dans chacun des scénarios suivants.
Affichage de l’écran des documents au format fixe.
Scénarios d’impression.
Langage XAML (Extensible Application Markup Language) en tant que langage d’imprimante d’appareil.
Enregistreur de documents Microsoft XPS.
Pilotes d’imprimante précédents, sortie d’applications Win32 au format fixe.
Format de spouleur d’impression.
Représentation de document au format fixe, y compris les clients pour les versions précédentes de Windows et d’autres appareils informatiques.
Remarque
Glyphs et GlyphRun sont conçus pour les scénarios de présentation de documents de format fixe et d’impression. WPF fournit plusieurs éléments pour les scénarios de disposition générale et d’interface utilisateur (UI) tels que Label et TextBlock. Pour plus d’informations sur les scénarios de disposition et d’interface utilisateur, consultez la Typographie dans WPF.
Les exemples suivants montrent comment définir des propriétés pour un Glyphs objet en XAML. Les exemples supposent que les polices Arial, Courier 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="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 DrawGlyphRun
Si vous avez un contrôle personnalisé et que vous souhaitez afficher des glyphes, utilisez la DrawGlyphRun méthode.
WPF fournit également des services de niveau inférieur pour la mise en forme de texte personnalisée via l’utilisation de l’objet FormattedText . Le moyen le plus efficace de restituer du texte dans Windows Presentation Foundation (WPF) consiste à générer du contenu de texte au niveau du glyphe à l’aide Glyphs et GlyphRun. Toutefois, le coût de cette efficacité est la perte de mise en forme de texte enrichi facile à utiliser, qui sont des fonctionnalités intégrées des contrôles WPF (Windows Presentation Foundation), telles que TextBlock et FlowDocument.
Objet FormattedText
L’objet FormattedText vous permet de dessiner du texte à plusieurs lignes, dans lequel chaque caractère du texte peut être mis en forme individuellement. Pour plus d’informations, consultez Dessin de texte mis en forme.
Pour créer du 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 mise en forme initiale, vous pouvez appliquer une plage de styles de mise en forme. Si votre application souhaite implémenter sa propre disposition, l'utilisation de l'objet FormattedText est préférable à celle d'un contrôle, tel que TextBlock. Pour plus d’informations sur l’objet FormattedText , consultez Dessin de texte formaté .
L’objet FormattedText fournit une fonctionnalité de mise en forme de texte de bas niveau. Vous pouvez appliquer plusieurs styles de mise en forme à un ou plusieurs caractères. Par exemple, vous pouvez appeler les méthodes SetFontSize et SetForegroundBrush pour modifier la mise en forme des cinq premiers caractères du texte.
L’exemple de code suivant crée un FormattedText objet 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));
}
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 Label
WPF inclut plusieurs contrôles pour dessiner du texte à l’écran. Chaque contrôle est destiné à un scénario différent et possède sa propre liste de fonctionnalités et de limitations.
FlowDocument impacte les performances plus que TextBlock ou Étiquette
En règle générale, l’élément TextBlock doit être utilisé lorsque la prise en charge limitée du texte est requise, par exemple une brève phrase dans une interface utilisateur. Label peut être utilisé lorsque la prise en charge minimale de texte est requise. L’élément FlowDocument est un conteneur pour les documents réadaptables qui prennent en charge une présentation enrichie du contenu et, par conséquent, a un impact plus élevé sur les performances que l’utilisation des contrôles TextBlock ou Label.
Pour plus d’informations sur FlowDocument, consultez Vue d'ensemble du document Flow.
Éviter d’utiliser TextBlock dans FlowDocument
L’élément TextBlock est dérivé de UIElement. L'élément Run est dérivé de TextElement, ce qui est moins coûteux à utiliser qu'un objet dérivé de UIElement. Si possible, utilisez Run plutôt que TextBlock pour afficher du contenu texte dans un FlowDocument.
L’exemple de balisage suivant illustre deux façons de définir le contenu du 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>
Éviter d’utiliser l’exécution pour définir des propriétés de texte
En général, l’utilisation d’un Run élément au sein d’un TextBlock exige plus de ressources en performance que ne pas utiliser du tout d’objet explicite Run. Si vous utilisez un Run pour définir des propriétés de texte, définissez plutôt ces propriétés directement sur le TextBlock.
L’exemple de balisage suivant illustre ces deux façons de définir une propriété de texte, dans ce cas, la FontWeight propriété :
<!-- 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 indique le coût d’affichage de 1 000 TextBlock objets avec et sans explicite Run.
Type de TextBlock | Heure de création (ms) | temps de rendu (ms) |
---|---|---|
Exécuter la définition des propriétés de texte | 146 | 540 |
TextBlock définissant les propriétés de texte | 43 | 453 |
Éviter la liaison de données à la propriété Label.Content
Imaginez un scénario dans lequel vous disposez d’un Label objet fréquemment mis à jour à partir d’une String source. Lorsque les données lient la Label propriété de Content l’élément à l’objet String source, vous risquez d’avoir des performances médiocres. Chaque fois que la source String est mise à jour, l’ancien String objet est ignoré et un nouvel String objet est recréé, car un String objet est immuable, il ne peut pas être modifié. Cela, à son tour, amène l'objet ContentPresenter à se débarrasser de son ancien contenu et à générer le nouveau contenu pour afficher le nouveau Label.
La solution à ce problème est simple. Si le Label n’est pas défini sur une valeur personnalisée ContentTemplate, remplacez le Label par un TextBlock et liez sa propriété Text aux données de la chaîne source.
Propriété liée aux données | Heure de mise à jour (ms) |
---|---|
Etiquette.Contenu | 835 |
TextBlock.Text | 242 |
Lien hypertexte
L’objet Hyperlink est un élément de contenu de flux inline qui vous permet d’héberger des liens hypertexte dans le contenu du flux.
Combiner des liens hypertexte dans un objet TextBlock
Vous pouvez optimiser l’utilisation de plusieurs Hyperlink éléments en les regroupant dans le même TextBlock. Cela permet de réduire le nombre d’objets que vous créez dans votre application. Par exemple, vous souhaiterez peut-être afficher plusieurs liens hypertexte, tels que :
MSN Accueil | Mon MSN
L’exemple de balisage suivant montre plusieurs TextBlock éléments utilisés pour afficher les liens hypertexte :
<!-- 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’aide d’un seul 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>
Affichage des soulignements sur les liens hypertexte uniquement sur les événements MouseEnter
Un TextDecoration objet est une ornementation visuelle que vous pouvez ajouter au texte ; toutefois, il peut être gourmand en performances pour instancier. Si vous utilisez largement les éléments Hyperlink, envisagez d’afficher un trait de soulignement uniquement lors du déclenchement d’un événement, tel que l’événement MouseEnter. Pour plus d’informations, consultez Spécifier si un lien hypertexte est souligné.
L’image suivante montre comment l’événement MouseEnter déclenche le lien hypertexte souligné :
L’exemple de balisage suivant montre une Hyperlink définie avec et sans soulignement :
<!-- 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 présente le coût des performances d’affichage de 1 000 Hyperlink éléments avec et sans soulignement.
Hyperlien | Heure de création (ms) | temps de rendu (ms) |
---|---|---|
Avec soulignement | 289 | 1130 |
Sans soulignement | 299 | 776 |
Fonctionnalités de mise en forme du texte
WPF fournit des services de mise en forme de texte enrichi, tels que les traits d’union automatiques. Ces services peuvent avoir un impact sur les performances de l’application et ne doivent être utilisés que si nécessaire.
Éviter l’utilisation inutile de traits d’union
Le trait d’union automatique recherche des points d’arrêt de traits d’union pour les lignes de texte et autorise des positions d’arrêt supplémentaires pour les lignes dans les objets TextBlock et FlowDocument. Par défaut, la fonctionnalité de trait d’union automatique est désactivée dans ces objets. Vous pouvez activer cette fonctionnalité en définissant la propriété IsHyphenationEnabled de l'objet sur true
. Toutefois, l’activation de cette fonctionnalité entraîne WPF à déclencher une interopérabilité avec le modèle d'objet de composant (COM), ce qui peut avoir un impact sur les performances de l'application. Il est recommandé de ne pas utiliser de trait d’union automatique, sauf si vous en avez besoin.
Utiliser soigneusement des chiffres
Un Figure élément représente une partie du contenu de flux qui peut être absolument positionné dans une page de contenu. Dans certains cas, une Figure page entière peut se reformater automatiquement si sa position entre en conflit avec le contenu déjà disposé. Vous pouvez réduire la possibilité de reformatage inutile en regroupant Figure les éléments en regard des uns des autres, ou en les déclarant en haut du contenu dans un scénario de taille de page fixe.
Paragraphe optimal
La fonctionnalité de paragraphe optimale de l’objet FlowDocument présente des paragraphes afin que l’espace blanc soit distribué aussi uniformément que possible. Par défaut, la fonctionnalité de paragraphe optimale est désactivée. Vous pouvez activer cette fonctionnalité en définissant la propriété de l’objet IsOptimalParagraphEnabled sur true
. Toutefois, l’activation de cette fonctionnalité a un impact sur les performances des applications. Il est recommandé de ne pas utiliser la fonctionnalité de paragraphe optimale, sauf si vous en avez besoin.
Voir aussi
.NET Desktop feedback