Optimalizace výkonu: Text

WPF zahrnuje podporu prezentace textového obsahu prostřednictvím ovládacích prvků uživatelského rozhraní s bohatými funkcemi. Vykreslování textu můžete obecně dělit ve třech vrstvách:

  1. Glyphs Přímé použití objektů a GlyphRun objektů

  2. Použití objektu FormattedText .

  3. Použití ovládacích prvků vysoké úrovně, jako TextBlock jsou objekty a FlowDocument objekty.

Toto téma obsahuje doporučení k výkonu vykreslování textu.

Vykreslení textu na úrovni Glyph

Windows Presentation Foundation (WPF) poskytuje pokročilou podporu textu včetně značek na úrovni glyph s přímým přístupem pro Glyphs zákazníky, kteří chtějí zachytit a zachovat text po formátování. Tyto funkce poskytují důležitou podporu pro různé požadavky na vykreslování textu v každém z následujících scénářů.

  • Zobrazení obrazovky dokumentů s pevným formátem

  • Scénáře tisku

    • Jazyk XAML (Extensible Application Markup Language) jako jazyk tiskárny zařízení

    • Microsoft XPS Document Writer.

    • Předchozí ovladače tiskárny, výstup z aplikací Win32 do pevného formátu.

    • Formát zařazování tisku

  • Reprezentace dokumentů s pevným formátem, včetně klientů pro předchozí verze Windows a jiných výpočetních zařízení.

Poznámka:

Glyphs a GlyphRun jsou navržené pro prezentace dokumentů s pevným formátem a scénáře tisku. WPF poskytuje několik prvků pro obecné scénáře rozložení a uživatelského rozhraní (UI), jako Label jsou a TextBlock. Další informace o scénářích rozložení a uživatelského rozhraní najdete v typografii WPF.

Následující příklady ukazují, jak definovat vlastnosti objektu Glyphs v XAML. Příklady předpokládají, že písma Arial, Courier New a Times New Roman jsou nainstalovaná ve složce C:\WINDOWS\Fonts na místním počítači.

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

Použití DrawGlyphRun

Pokud máte vlastní ovládací prvek a chcete vykreslit glyfy, použijte metodu DrawGlyphRun .

WPF také poskytuje služby nižší úrovně pro vlastní formátování textu prostřednictvím použití objektu FormattedText . Nejúčinnějším způsobem vykreslování textu ve Windows Presentation Foundation (WPF) je generování textového obsahu na úrovni glyf pomocí Glyphs a GlyphRun. Náklady na tuto efektivitu jsou však ztrátou snadného použití formátování rtf, což jsou integrované funkce ovládacích prvků Windows Presentation Foundation (WPF), například TextBlock a FlowDocument.

FormattedText – objekt

Objekt FormattedText umožňuje nakreslit víceřádkový text, ve kterém může být každý znak textu individuálně formátován. Další informace naleznete v tématu Formátovaný text výkresu.

Chcete-li vytvořit formátovaný text, zavolejte FormattedText konstruktor k vytvoření objektu FormattedText . Po vytvoření počátečního formátovaného textového řetězce můžete použít rozsah stylů formátování. Pokud vaše aplikace chce implementovat vlastní rozložení, je FormattedText lepší volbou než použití ovládacího prvku, například TextBlock. Další informace o objektu FormattedText naleznete v tématu Kreslení formátovaný text .

Objekt FormattedText poskytuje funkci formátování textu nízké úrovně. U jednoho nebo více znaků můžete použít více stylů formátování. Můžete například volat jak metody SetFontSizeSetForegroundBrush , tak i změnit formátování prvních pěti znaků v textu.

Následující příklad kódu vytvoří FormattedText objekt a vykreslí ho.

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

Ovládací prvky FlowDocument, TextBlock a Label

WPF obsahuje více ovládacích prvků pro kreslení textu na obrazovku. Každý ovládací prvek se zaměřuje na jiný scénář a má vlastní seznam funkcí a omezení.

FlowDocument ovlivňuje výkon více než TextBlock nebo Popisek.

Obecně platí, že prvek by se měl použít v případě, TextBlock že je vyžadována omezená podpora textu, například stručná věta v uživatelském rozhraní. Label lze použít v případě, že je vyžadována minimální podpora textu. Element FlowDocument je kontejner pro opakovaně použitelné dokumenty, které podporují bohatou prezentaci obsahu, a proto má větší dopad na výkon než použití ovládacích TextBlock prvků.Label

Další informace najdete FlowDocumentv tématu Přehled dokumentu toku.

Vyhněte se použití textového bloku ve formátu FlowDocument

Prvek TextBlock je odvozen z UIElement. Prvek Run je odvozen z TextElement, což je méně nákladné použít než -odvozený UIElementobjekt. Pokud je to možné, používejte Run místo TextBlock pro zobrazení textového obsahu v objektu FlowDocument.

Následující ukázka značek znázorňuje dva způsoby nastavení textového obsahu v rámci 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>

Vyhněte se použití příkazu Spustit k nastavení vlastností textu

Obecně platí, že použití uvnitř objektu RunTextBlock je náročnější na výkon, než vůbec nepoužívá explicitní Run objekt. Pokud k nastavení vlastností textu používáte příkaz, Run nastavte tyto vlastnosti přímo na TextBlock místo toho.

Následující ukázka značek znázorňuje tyto dva způsoby nastavení textové vlastnosti, v tomto případě FontWeight vlastnost:

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

Následující tabulka ukazuje náklady na zobrazení 1 000 TextBlock objektů s explicitním Run.

Typ TextBlock Čas vytvoření (ms) Doba vykreslování (ms)
Spuštění nastavení vlastností textu 146 540
TextBlock – nastavení vlastností textu 43 453

Vyhněte se vazbám dat na vlastnost Label.Content

Představte si scénář, ve kterém máte Label objekt, který se často aktualizuje ze String zdroje. Když data prováže vlastnost elementu LabelContent se zdrojovým objektem String , může dojít k nízkému výkonu. Při každé aktualizaci zdroje String se starý String objekt zahodí a vytvoří se nový String – protože String objekt je neměnný, nedá se změnit. To zase způsobí ContentPresenterLabel , že objekt zahodí svůj starý obsah a znovu vygeneruje nový obsah, aby se zobrazil nový String.

Řešení tohoto problému je jednoduché. Label Pokud není nastavena na vlastní ContentTemplate hodnotu, nahraďte Label hodnotu TextBlock a data svázání jeho Text vlastnosti se zdrojovým řetězcem.

Vlastnost svázaná s daty Čas aktualizace (ms)
Label.Content 835
TextBlock.Text 242

Objekt Hyperlink je vložený prvek obsahu toku, který umožňuje hostovat hypertextové odkazy v obsahu toku.

Použití více Hyperlink prvků můžete optimalizovat tak, že je seskupíte do stejného TextBlocksouboru . To pomáhá minimalizovat počet objektů, které v aplikaci vytvoříte. Můžete například chtít zobrazit více hypertextových odkazů, například následující:

Domovská stránka SLUŽBY MSN | Moje msn

Následující příklad revize ukazuje více TextBlock prvků použitých k zobrazení hypertextových odkazů:

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

Následující příklad značek ukazuje efektivnější způsob zobrazení hypertextových odkazů, tentokrát pomocí jediné 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>

Objekt TextDecoration je vizuální ozdoba, kterou můžete přidat k textu, ale může být náročné na vytvoření instance. Pokud používáte velké množství Hyperlink prvků, zvažte zobrazení podtržení pouze při aktivaci události, například MouseEnter události. Další informace naleznete v tématu Určení, zda je hypertextový odkaz podtrženo.

Následující obrázek ukazuje, jak událost MouseEnter aktivuje podtržené hypertextové odkazy:

Hyperlinks displaying TextDecorations

Následující ukázka značek ukazuje Hyperlink definovaný s podtržením a bez podtržení:

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

Následující tabulka ukazuje náklady na výkon zobrazení 1000 Hyperlink prvků s podtržením a bez podtržení.

Hypertextový odkaz Čas vytvoření (ms) Doba vykreslování (ms)
Podtržením 289 1130
Bez podtržení 299 776

Funkce formátování textu

WPF poskytuje služby formátování textu ve formátu RTF, například automatické dělení slov. Tyto služby můžou mít vliv na výkon aplikace a měly by být použity pouze v případě potřeby.

Vyhněte se zbytečnému použití dělení slov

Automatické dělení slov vyhledá zarážky spojovníků pro řádky textu a umožňuje další pozice zalomení pro řádky v TextBlock a FlowDocument objektech. Ve výchozím nastavení je funkce automatického dělení slov v těchto objektech zakázaná. Tuto funkci můžete povolit nastavením vlastnosti IsHyphenationEnabled objektu na truehodnotu . Povolení této funkce však způsobí, že WPF zahájí interoperabilitu modelu COM (Component Object Model), což může mít vliv na výkon aplikace. Pokud ho nepotřebujete, doporučujeme nepoužívat automatické dělení slov.

Pečlivě používejte obrázky.

Prvek Figure představuje část obsahu toku, která může být zcela umístěna na stránce obsahu. V některých případech může způsobit, že se celá stránka automaticky přeformátuje, Figure pokud jeho pozice koliduje s obsahem, který už byl rozložen. Možnost zbytečného přeformátování můžete minimalizovat seskupením Figure prvků vedle sebe nebo jejich deklarováním v horní části obsahu ve scénáři s pevnou velikostí stránky.

Optimální odstavec

Optimální funkce odstavce objektu FlowDocument vyloží odstavce tak, aby se prázdné znaky distribuoval co nejrovnoměrněji. Ve výchozím nastavení je optimální funkce odstavce zakázaná. Tuto funkci můžete povolit nastavením vlastnosti objektu IsOptimalParagraphEnabled na truehodnotu . Povolení této funkce má ale vliv na výkon aplikace. Doporučuje se, abyste nepoužít optimální funkci odstavce, pokud ji nepotřebujete.

Viz také