Delen via


Prestaties optimaliseren: tekst

WPF bevat ondersteuning voor de presentatie van tekstinhoud door gebruik te maken van feature-rich UI-besturingselementen. Over het algemeen kunt u tekstweergave in drie lagen verdelen:

  1. De Glyphs- en GlyphRun-objecten rechtstreeks gebruiken.

  2. Het FormattedText object gebruiken.

  3. Het gebruik van besturingselementen op hoog niveau, zoals de TextBlock en FlowDocument objecten.

Dit onderwerp bevat aanbevelingen voor het weergeven van tekstprestaties.

Tekst weergeven op Glyph-niveau

Windows Presentation Foundation (WPF) biedt geavanceerde tekstondersteuning, waaronder markeringen op glyph-niveau met directe toegang tot Glyphs voor klanten die tekst willen onderscheppen en behouden na opmaak. Deze functies bieden essentiële ondersteuning voor de verschillende vereisten voor tekstweergave in elk van de volgende scenario's.

  • Schermweergave van documenten met vaste indeling.

  • Scenario's afdrukken.

    • Extensible Application Markup Language (XAML) als printertaal voor apparaten.

    • Microsoft XPS Document Writer.

    • Eerdere printerstuurprogramma's zorgden voor de uitvoer van Win32-toepassingen naar het vaste formaat.

    • Afdrukspool-indeling.

  • Documentweergave met vaste indeling, waaronder clients voor eerdere versies van Windows en andere computerapparaten.

Opmerking

Glyphs en GlyphRun zijn ontworpen voor documentpresentaties en afdrukscenario's met vaste opmaak. WPF biedt verschillende elementen voor algemene indelings- en gebruikersinterfacescenario's zoals Label en TextBlock. Zie de Typografie in WPF-voor meer informatie over indelings- en ui-scenario's.

In de volgende voorbeelden ziet u hoe u eigenschappen definieert voor een Glyphs-object in XAML. In de voorbeelden wordt ervan uitgegaan dat de lettertypen Arial, Courier New en Times New Roman zijn geïnstalleerd in de map C:\WINDOWS\Fonts op de lokale 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>

DrawGlyphRun gebruiken

Als u een aangepast besturingselement hebt en u glyphs wilt weergeven, gebruikt u de DrawGlyphRun methode.

WPF biedt ook services op lager niveau voor aangepaste tekstopmaak via het gebruik van het FormattedText object. De meest efficiënte manier om tekst weer te geven in Windows Presentation Foundation (WPF) is door tekstinhoud te genereren op glyph-niveau met behulp van Glyphs en GlyphRun. De kosten van deze efficiëntie zijn echter het verlies van eenvoudige tekstopmaak, die ingebouwde functies zijn van Windows Presentation Foundation (WPF)-besturingselementen, zoals TextBlock en FlowDocument.

GeformatteerdeTekst-object

Met FormattedText het object kunt u tekst met meerdere regels tekenen, waarin elk teken in de tekst afzonderlijk kan worden opgemaakt. Raadpleeg Geformatteerde Tekst Tekenen voor meer informatie.

Als u opgemaakte tekst wilt maken, roept u de FormattedText constructor aan om een FormattedText object te maken. Nadat u de oorspronkelijk opgemaakte tekenreeks hebt gemaakt, kunt u een reeks opmaakstijlen toepassen. Als uw toepassing een eigen indeling wil implementeren, is het FormattedText object een betere keuze dan het gebruik van een besturingselement, zoals TextBlock. Voor meer informatie over het FormattedText object, zie Geformatteerde tekst tekenen.

Het FormattedText object biedt tekstopmaak op laag niveau. U kunt meerdere opmaakstijlen toepassen op een of meer tekens. U kunt bijvoorbeeld zowel de SetFontSize als SetForegroundBrush de methoden aanroepen om de opmaak van de eerste vijf tekens in de tekst te wijzigen.

In het volgende codevoorbeeld wordt een FormattedText object gemaakt en weergegeven.

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

Besturingselementen voor FlowDocument, TextBlock en Label

WPF bevat meerdere besturingselementen voor het tekenen van tekst naar het scherm. Elk besturingselement is gericht op een ander scenario en heeft een eigen lijst met functies en beperkingen.

FlowDocument beïnvloedt de prestaties meer dan TextBlock of Label

Over het algemeen moet het element TextBlock worden gebruikt wanneer beperkte tekstondersteuning vereist is, zoals een korte zin in een gebruikersinterface (UI). Label kan worden gebruikt wanneer minimale tekstondersteuning vereist is. Het FlowDocument element is een container voor herstroombare documenten die ondersteuning bieden voor uitgebreide presentatie van inhoud en heeft daarom een grotere invloed op de prestaties dan het gebruik van de TextBlock of Label besturingselementen.

Zie FlowDocument voor meer informatie.

Vermijd het gebruik van TextBlock in FlowDocument

Het TextBlock element is afgeleid van UIElement. Het Run element is afgeleid van TextElement, wat minder kostbaar is om te gebruiken dan een UIElement-afgeleide object. Gebruik, indien mogelijk, Run in plaats TextBlock van voor het weergeven van tekstinhoud in een FlowDocument.

In het volgende opmaakvoorbeeld ziet u twee manieren om tekstinhoud in te stellen binnen een 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>

Vermijd het gebruik van de run-functie om tekstinstellingen te configureren.

Over het algemeen is het gebruik van een Run binnen een TextBlock meer prestatie-intensief dan helemaal geen expliciet Run object te gebruiken. Als u een Run eigenschap gebruikt om teksteigenschappen in te stellen, stelt u deze eigenschappen rechtstreeks in TextBlock .

Het volgende voorbeeld van markeringen illustreert deze twee manieren om een teksteigenschap in te stellen, in dit geval de FontWeight eigenschap:

<!-- 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>

In de volgende tabel ziet u de kosten voor het weergeven van 1000 TextBlock objecten met en zonder expliciete Run.

TextBlocktype Aanmaaktijd (ms) Weergavetijd (ms)
Texteigenschapsinstellingen uitvoeren 146 540
Instellen van teksteigenschappen in een TextBlock 43 453

Vermijd het koppelen van gegevens aan de eigenschap Label.Content

Stel dat u een scenario hebt waarin u een Label object hebt dat regelmatig wordt bijgewerkt vanuit een String bron. Wanneer de eigenschap Label van het Content-element aan het String-bronobject wordt gebonden, kunt u slechte prestaties ervaren. Telkens wanneer de bron String wordt bijgewerkt, wordt het oude String object verwijderd en wordt een nieuw String object opnieuw gemaakt, omdat een String object onveranderbaar is, kan het niet worden gewijzigd. Dit zorgt er op zijn beurt voor dat het ContentPresenter object de Label oude inhoud negeert en de nieuwe inhoud opnieuw genereert om het nieuwe Stringweer te geven.

De oplossing voor dit probleem is eenvoudig. Als de Label niet is ingesteld op een aangepaste ContentTemplate waarde, vervang dan het Label door een TextBlock en koppel de Text eigenschap aan de brontekenreeks.

Gegevensgebonden eigenschap Tijd bijwerken (ms)
Label.Inhoud 835
TextBlock.Text 242

Het Hyperlink-object is een inhoudselement op inlineniveau waarmee u hyperlinks binnen de stroominhoud kunt hosten.

U kunt het gebruik van meerdere Hyperlink elementen optimaliseren door ze in hetzelfde TextBlockte groeperen. Dit helpt bij het minimaliseren van het aantal objecten dat u in uw toepassing maakt. U kunt bijvoorbeeld meerdere hyperlinks weergeven, zoals de volgende:

MSN Home | Mijn MSN

In het volgende markeringsvoorbeeld ziet u meerdere TextBlock elementen die worden gebruikt om de hyperlinks weer te geven:

<!-- 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>

In het volgende voorbeeld van markeringen ziet u een efficiëntere manier om de hyperlinks weer te geven, deze keer met behulp van één 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>

Een TextDecoration object is een visuele versiering die u aan tekst kunt toevoegen. Het kan echter prestatie-intensief zijn om te instantiëren. Als u veel gebruikmaakt van Hyperlink-elementen, kunt u overwegen alleen een onderstreping weer te geven bij het activeren van een gebeurtenis, zoals de MouseEnter-gebeurtenis. Zie Opgeven of een hyperlink is onderstreeptvoor meer informatie.

In de volgende afbeelding ziet u hoe de MouseEnter-gebeurtenis de onderstreepte hyperlink activeert:

hyperlinks met tekstdecoraties

In het volgende voorbeeld van markeringen ziet u een Hyperlink gedefinieerd met en zonder onderstreping:

<!-- 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 de volgende tabel ziet u de prestatiekosten voor het weergeven van 1000 Hyperlink elementen met en zonder onderstreping.

Hyperlink Aanmaaktijd (ms) Weergavetijd (ms)
Met onderstreping 289 1130
Zonder onderstreping 299 776

Functies voor tekstopmaak

WPF biedt opmaakdiensten, zoals automatische woordafbrekingen. Deze services kunnen van invloed zijn op de prestaties van toepassingen en mogen alleen worden gebruikt wanneer dat nodig is.

Vermijd onnodig gebruik van woordafbreking

Met automatische woordafbreking vindt u onderbrekingspunten voor afbreekstreepjes voor tekstregels en kunt u extra onderbrekingsposities voor regels in TextBlock en FlowDocument objecten toestaan. De functie voor automatische woordafbreking is standaard uitgeschakeld in deze objecten. U kunt deze functie inschakelen door de eigenschap IsHyphenationEnabled van het object in te stellen op true. Als u deze functie inschakelt, kan WPF echter COM-interoperabiliteit (Component Object Model) initiëren, wat van invloed kan zijn op de prestaties van de toepassing. Het wordt aanbevolen dat u geen automatische afbreekstreepjes gebruikt, tenzij u deze nodig hebt.

Gebruik afbeeldingen zorgvuldig

Een Figure element vertegenwoordigt een gedeelte van stroominhoud dat absoluut kan worden geplaatst op een pagina met inhoud. In sommige gevallen kan een Figure de hele pagina automatisch opnieuw opmaken als de positie ervan botst met inhoud die al is ingedeeld. U kunt de kans op onnodige herformattering verkleinen door de Figure-elementen naast elkaar te groeperen of deze dicht bij de bovenkant van de inhoud in een scenario met een vast paginaformaat te declareren.

Optimale alinea

Met de optimale alineafunctie van het FlowDocument object worden alinea's zo gelijkmatig mogelijk verdeeld, zodat witruimte zo gelijkmatig mogelijk wordt verdeeld. Standaard is de optimale alineafunctie uitgeschakeld. U kunt deze functie inschakelen door de eigenschap van IsOptimalParagraphEnabled het object in te stellen op true. Het inschakelen van deze functie is echter van invloed op de prestaties van de toepassing. Het wordt aanbevolen om de optimale alineafunctie niet te gebruiken, tenzij u deze nodig hebt.

Zie ook