Optimieren der Leistung: TextOptimizing Performance: Text

WPFWPF bietet Unterstützung für die Präsentation von Textinhalt durch Verwendung von umfangreichen Benutzeroberfläche (User Interface, UI)user interface (UI)-Steuerelementen.includes support for the presentation of text content through the use of feature-rich Benutzeroberfläche (User Interface, UI)user interface (UI) controls. Im Allgemeinen können Sie das Rendern von Text in drei Ebenen unterteilen:In general you can divide text rendering in three layers:

  1. Direkte Verwendung Glyphs des GlyphRun -Objekts und des-Objekts.Using the Glyphs and GlyphRun objects directly.

  2. Verwenden des FormattedText -Objekts.Using the FormattedText object.

  3. Verwenden von Steuerelementen auf hoher Ebene, z TextBlock . FlowDocument b. die Objekte und.Using high-level controls, such as the TextBlock and FlowDocument objects.

In diesem Thema erhalten Sie Empfehlungen bezüglich des Renderns von Text.This topic provides text rendering performance recommendations.

Rendern von Text auf der SymbolebeneRendering Text at the Glyph Level

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)bietet erweiterte Unterstützung für Text, einschließlich Markup auf Symbolebene mit direktem Glyphs Zugriff auf für Kunden, die Text nach der Formatierung abfangen und beibehalten möchten.provides advanced text support including glyph-level markup with direct access to Glyphs for customers who want to intercept and persist text after formatting. Diese Funktionen stellen wichtige Unterstützung für verschiedene Text-Rendering-Voraussetzungen in jedem der folgenden Szenarios bereit.These features provide critical support for the different text rendering requirements in each of the following scenarios.

  • Bildschirmanzeige von Dokumenten mit festem FormatScreen display of fixed-format documents.

  • DruckszenariosPrint scenarios.

    • Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) als Druckersprache für Geräteas a device printer language.

    • Microsoft XPS-Dokumentwriter.Microsoft XPS Document Writer.

    • Vorherige Druckertreiber, Ausgabe von Win32Win32-Anwendungen an das feste FormatPrevious printer drivers, output from Win32Win32 applications to the fixed format.

    • Druckerspooler-FormatPrint spool format.

  • Dokument Darstellung mit festem Format, einschließlich Clients für frühere Versionen von Windows und anderen Computergeräten.Fixed-format document representation, including clients for previous versions of Windows and other computing devices.

Hinweis

Glyphsund GlyphRun sind für Dokument Präsentations-und Druck Szenarien mit festem Format konzipiert.Glyphs and GlyphRun are designed for fixed-format document presentation and print scenarios. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)bietet mehrere-Elemente für allgemeines Layout Benutzeroberfläche (User Interface, UI)user interface (UI) und Szenarios Label wie TextBlockund.provides several elements for general layout and Benutzeroberfläche (User Interface, UI)user interface (UI) scenarios such as Label and TextBlock. Weitere Informationen zu Layout- und UIUI-Szenarios finden Sie unter Typografie in WPF.For more information on layout and UIUI scenarios, see the Typography in WPF.

In den folgenden Beispielen wird gezeigt, wie Eigenschaften für Glyphs ein- Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)Objekt in definiert werden.The following examples show how to define properties for a Glyphs object in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML). Das Glyphs -Objekt stellt die Ausgabe GlyphRun eines in XAMLXAMLdar.The Glyphs object represents the output of a GlyphRun in XAMLXAML. In den Beispielen wird davon ausgegangen, dass die Schriftarten Arial, Courier New und Times New Roman im Ordner C:\WINDOWS\Fonts auf dem lokalen Computer installiert sind.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>

Verwenden von DrawGlyphRunUsing DrawGlyphRun

Wenn Sie über ein benutzerdefiniertes Steuerelement verfügen und Symbole darstellen möchten, DrawGlyphRun verwenden Sie die-Methode.If you have custom control and you want to render glyphs, use the DrawGlyphRun method.

WPFWPFbietet auch Dienste auf niedrigerer Ebene für die benutzerdefinierte Textformatierung durch die FormattedText Verwendung des-Objekts.also provides lower-level services for custom text formatting through the use of the FormattedText object. Die effizienteste Methode zum Rendern von Text Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) in besteht darin, Text Inhalt mithilfe Glyphs von und GlyphRunauf der Symbolebene zu erstellen.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. Die Kosten für diese Effizienz sind jedoch der Verlust einer leicht zu verwendenden Rich-Text-Formatierung, bei der es sich um Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) integrierte Funktionen von Steuer TextBlock Elementen FlowDocumenthandelt, wie z. b. und.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.

FormattedText-ObjektFormattedText Object

Das FormattedText -Objekt ermöglicht das Zeichnen von mehrzeiligen Text, in dem jedes Zeichen im Text einzeln formatiert werden kann.The FormattedText object allows you to draw multi-line text, in which each character in the text can be individually formatted. Weitere Informationen finden Sie unter Drawing Formatted Text (Zeichnen von formatiertem Text).For more information, see Drawing Formatted Text.

Um formatierten Text zu erstellen, FormattedText rufen Sie den-Konstruktor zum Erstellen eines FormattedText -Objekts auf.To create formatted text, call the FormattedText constructor to create a FormattedText object. Nachdem Sie die Anfangszeichenfolge für formatierten Text erstellt haben, können Sie eine Reihe von Formatvorlagen anwenden.Once you have created the initial formatted text string, you can apply a range of formatting styles. Wenn Ihre Anwendung ein eigenes Layout implementieren möchte, ist das- FormattedText Objekt besser geeignet als die Verwendung eines-Steuer Elements, TextBlockz. b.If your application wants to implement its own layout, then the FormattedText object is better choice than using a control, such as TextBlock. Weitere Informationen zum- FormattedText Objekt finden Sie unter Zeichnen von formatiertem Text .For more information on the FormattedText object, see Drawing Formatted Text .

Das FormattedText -Objekt stellt Text Formatierungsfunktionen auf niedriger Ebene bereit.The FormattedText object provides low-level text formatting capability. Sie können mehrere Formatvorlagen auf ein oder mehrere Zeichen anwenden.You can apply multiple formatting styles to one or more characters. Beispielsweise können Sie sowohl die SetFontSize -Methode als auch die- SetForegroundBrush Methode aufzurufen, um die Formatierung der ersten fünf Zeichen im Text zu ändern.For example, you could call both the SetFontSize and SetForegroundBrush methods to change the formatting of the first five characters in the text.

Im folgenden Codebeispiel wird ein FormattedText -Objekt erstellt und gerendert.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

FlowDocument, TextBlock- und Label-SteuerelementeFlowDocument, TextBlock, and Label Controls

WPFWPF enthält zahlreiche Steuerelemente für das Zeichnen von Text auf dem Bildschirm.includes multiple controls for drawing text to the screen. Jedes Steuerelement dient einem anderen Szenario und verfügt über eine eigene Liste von Funktionen und Einschränkungen.Each control is targeted to a different scenario and has its own list of features and limitations.

FlowDocument wirkt sich mehr auf die Leistung aus als TextBlock oder LabelFlowDocument Impacts Performance More than TextBlock or Label

Im Allgemeinen sollte das TextBlock -Element verwendet werden, wenn eingeschränkte Textunterstützung erforderlich ist, z. b. ein kurzer Benutzeroberfläche (User Interface, UI)user interface (UI)Satz in einer.In general, the TextBlock element should be used when limited text support is required, such as a brief sentence in a Benutzeroberfläche (User Interface, UI)user interface (UI). Labelkann verwendet werden, wenn nur minimale Textunterstützung erforderlich ist.Label can be used when minimal text support is required. Das FlowDocument -Element ist ein Container für erneut flowable-Dokumente, die eine umfangreiche Präsentation von Inhalten unterstützen und somit eine höhere Leistung als die TextBlock Verwendung Label der-oder-Steuerelemente haben.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.

Weitere Informationen zu finden FlowDocumentSie unter Übersicht über Fluss Dokumente.For more information on FlowDocument, see Flow Document Overview.

Vermeiden von TextBlock in FlowDocumentAvoid Using TextBlock in FlowDocument

Das TextBlock -Element wird von UIElementabgeleitet.The TextBlock element is derived from UIElement. Das Run -Element wird von TextElementabgeleitet. Dies ist weniger kostspielig als ein UIElementvon abgeleitetes Objekt.The Run element is derived from TextElement, which is less costly to use than a UIElement-derived object. Verwenden Run Sie TextBlock nach Möglichkeit anstelle von, um Textinhalte in einem FlowDocumentanzuzeigen.When possible, use Run rather than TextBlock for displaying text content in a FlowDocument.

Im folgenden Markup Beispiel werden zwei Möglichkeiten zum Festlegen von Text Inhalt in FlowDocumenteinem veranschaulicht: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>

Vermeiden von Run zum Festlegen von TexteigenschaftenAvoid Using Run to Set Text Properties

Im Allgemeinen ist die Verwendung Run von innerhalb TextBlock einer Leistungs intensiver als die Verwendung eines expliziten Run Objekts.In general, using a Run within a TextBlock is more performance intensive than not using an explicit Run object at all. Wenn Sie verwenden Run , um Texteigenschaften festzulegen, legen Sie diese Eigenschaften TextBlock stattdessen direkt auf fest.If you are using a Run in order to set text properties, set those properties directly on the TextBlock instead.

Im folgenden Markup Beispiel werden diese beiden Methoden zum Festlegen einer Text Eigenschaft (in diesem Fall die FontWeight -Eigenschaft) veranschaulicht: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>

Die folgende Tabelle zeigt die Kosten für die Anzeige TextBlock von 1000-Objekten mit und Runohne explizite.The following table shows the cost of displaying 1000 TextBlock objects with and without an explicit Run.

TextBlock-TypTextBlock type Erstellungszeit (in ms)Creation time (ms) Renderingzeit (in ms)Render time (ms)
Run zum Festlegen von TexteigenschaftenRun setting text properties 146146 540540
TextBlock zum Festlegen von TexteigenschaftenTextBlock setting text properties 4343 453453

Vermeiden von Datenbindung an die Label.Content-EigenschaftAvoid Databinding to the Label.Content Property

Stellen Sie sich ein Szenario vor, Label in dem Sie über ein-Objekt String verfügen, das häufig von einer Quelle aktualisiert wirdImagine a scenario where you have a Label object that is updated frequently from a String source. Bei der Datenbindung Label der- Content Eigenschaft des Elements String an das Quell Objekt kann eine schlechte Leistung auftreten.When data binding the Label element's Content property to the String source object, you may experience poor performance. Jedes Mal, wenn String die Quelle aktualisiert wird, String wird das alte Objekt verworfen und String ein neuer neu erstellt – da String ein-Objekt unveränderlich ist, kann es nicht geändert werden.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. Dies bewirkt wiederum, dass der ContentPresenter Label des-Objekts seinen alten Inhalt verwerfen und den neuen Inhalt neu generiert, um die neue Stringanzuzeigen.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.

Die Lösung für dieses Problem ist einfach.The solution to this problem is simple. Wenn der Label nicht auf einen benutzerdefinierten ContentTemplate Wert festgelegt ist, Label ersetzen Sie TextBlock den durch einen, Text und binden Sie seine-Eigenschaft an die Quell Zeichenfolge.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.

Datengebundene EigenschaftData bound property Aktualisierungszeit (in ms)Update time (ms)
Label.ContentLabel.Content 835835
TextBlock.TextTextBlock.Text 242242

Das Hyperlink -Objekt ist ein fortlaufendes Inhalts Element auf Inline Ebene, mit dem Sie Hyperlinks innerhalb des fortlaufenden Inhalts hosten können.The Hyperlink object is an inline-level flow content element that allows you to host hyperlinks within the flow content.

Sie können die Verwendung mehrerer Hyperlink Elemente optimieren, indem Sie Sie innerhalb desselben TextBlockgruppieren.You can optimize the use of multiple Hyperlink elements by grouping them together within the same TextBlock. Dadurch wird die Anzahl der Objekte minimiert, die Sie in Ihrer Anwendung erstellen.This helps to minimize the number of objects you create in your application. Zum Beispiel kann es vorkommen, dass Sie mehrere Links wie folgt anzeigen möchten:For example, you may want to display multiple hyperlinks, such as the following:

MSN Home | My MSNMSN Home | My MSN

Das folgende Markup Beispiel zeigt mehrere TextBlock Elemente, die zum Anzeigen der Hyperlinks verwendet werden: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>

Im folgenden Markup Beispiel wird ein effizienteres Verfahren zum Anzeigen der Hyperlinks gezeigt, diesmal mit einem einzelnen 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>

Bei TextDecoration einem-Objekt handelt es sich um eine visuelle Verzierung, die Sie Text hinzufügen können. es kann jedoch eine Leistungs intensive instanziieren sein.A TextDecoration object is a visual ornamentation that you can add to text; however, it can be performance intensive to instantiate. Wenn Sie Hyperlink Elemente umfassend verwenden, sollten Sie eine Unterstreichung nur beim Auslösen eines Ereignisses, z. b. MouseEnter dem-Ereignis, in Erwägung gezogen.If you make extensive use of Hyperlink elements, consider showing an underline only when triggering an event, such as the MouseEnter event. Weitere Informationen finden Sie unter Specify Whether a Hyperlink is Underlined (Angeben, ob ein Link unterstrichen wird).For more information, see Specify Whether a Hyperlink is Underlined.

Die folgende Abbildung zeigt, wie das mouposienter-Ereignis den unterstrichenen Hyperlink auslöst:The following image shows how the MouseEnter event triggers the underlined hyperlink:

Links mit TextDecorations

Das folgende Markup Beispiel zeigt einen Hyperlink , der mit und ohne Unterstreichung definiert ist: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>

In der folgenden Tabelle werden die Leistungseinbußen der Anzeige Hyperlink von 1000 Elementen mit und ohne Unterstreichung aufgeführt.The following table shows the performance cost of displaying 1000 Hyperlink elements with and without an underline.

LinkHyperlink Erstellungszeit (in ms)Creation time (ms) Renderingzeit (in ms)Render time (ms)
Mit UnterstreichungWith underline 289289 11301130
Ohne UnterstreichungWithout underline 299299 776776

TextformatierungsfunktionenText Formatting Features

WPFWPF bietet umfangreiche Formatierungsdienste wie automatische Silbentrennung.provides rich text formatting services, such as automatic hyphenations. Diese Dienste können die Leistung der Anwendung beeinträchtigen und sollten nur bei Bedarf verwendet werden.These services may impact application performance and should only be used when needed.

Vermeiden von unnötiger SilbentrennungAvoid Unnecessary Use of Hyphenation

Die automatische Silben Trennung findet Bindestriche für Textzeilen und ermöglicht zusätzliche Breakpoints für Linien in TextBlock -und- FlowDocument Objekten.Automatic hyphenation finds hyphen breakpoints for lines of text, and allows additional break positions for lines in TextBlock and FlowDocument objects. In der Standardeinstellung ist die automatische Silbentrennung in diesen Objekten deaktiviert.By default, the automatic hyphenation feature is disabled in these objects. Sie können diese Funktion aktivieren, indem Sie die IsHyphenationEnabled-Eigenschaft des Objekts auf true festlegen.You can enable this feature by setting the object's IsHyphenationEnabled property to true. Das Aktivieren dieses Features bewirkt WPFWPF jedoch, dass die Interoperabilität von Component Object Model (com) initiiert wird, was sich auf die Leistung der Anwendung auswirken kann.However, enabling this feature causes WPFWPF to initiate Component Object Model (COM) interoperability, which can impact application performance. Es wird empfohlen, die automatische Silbentrennung nur bei Bedarf zu verwenden.It is recommended that you do not use automatic hyphenation unless you need it.

Vorsichtiges Verwenden von Figure-ElementenUse Figures Carefully

Ein Figure -Element stellt einen Teil des fortlaufenden Inhalts dar, der in einer Inhaltsseite absolut positioniert werden kann.A Figure element represents a portion of flow content that can be absolutely-positioned within a page of content. In einigen Fällen kann ein Figure bewirken, dass eine gesamte Seite automatisch neu formatiert wird, wenn die Position mit Inhalt, der bereits angelegt wurde, in Konflikt steht. Sie können die Möglichkeit der unnötigen Neuformatierung minimieren, indem Sie Figure Elemente nebeneinander gruppieren oder Sie in einem Szenario mit fester Seitengröße am oberen Rand des Inhalts deklarieren.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.

Optimale AbsatzformatierungOptimal Paragraph

Mit der optimalen Absatz Funktion des FlowDocument -Objekts werden Absätze angelegt, sodass Leerraum so gleichmäßig wie möglich verteilt wird.The optimal paragraph feature of the FlowDocument object lays out paragraphs so that white space is distributed as evenly as possible. In der Standardeinstellung ist die optimale Absatzformatierung deaktiviert.By default, the optimal paragraph feature is disabled. Sie können diese Funktion aktivieren, indem Sie die- IsOptimalParagraphEnabled Eigenschaft des true-Objekts auf festlegen.You can enable this feature by setting the object's IsOptimalParagraphEnabled property to true. Allerdings beeinträchtigt die Aktivierung dieser Funktion die Leistung der Anwendung.However, enabling this feature impacts application performance. Es wird empfohlen, die optimale Absatzformatierung nur bei Bedarf zu verwenden.It is recommended that you do not use the optimal paragraph feature unless you need it.

Siehe auchSee also