Megosztás a következőn keresztül:


Teljesítmény optimalizálása: Szöveg

A WPF támogatja a szöveges tartalom megjelenítését a funkciókban gazdag felhasználói felületi (UI) vezérlők használatával. A szövegmegjelenítéseket általában három rétegre oszthatja:

  1. Az Glyphs és GlyphRun objektumok közvetlen használata.

  2. A FormattedText objektum használata.

  3. Magas szintű vezérlők, például a TextBlock és FlowDocument objektumok használata.

Ez a témakör a szövegmegjelenítési teljesítményre vonatkozó javaslatokat nyújt.

Szöveg megjelenítése a Glyph szintjén

A Windows Presentation Foundation (WPF) speciális szövegtámogatást biztosít, beleértve a jelölésszintű szerkesztést is, amely közvetlen hozzáférést biztosít a Glyphs-hoz olyan ügyfeleknek, akik formázás után szeretnék elfogni és megőrizni a szöveget. Ezek a funkciók kritikus támogatást nyújtanak a különböző szövegmegjelenítési követelményekhez az alábbi forgatókönyvekben.

  • Rögzített formátumú dokumentumok képernyőmegjelenítése.

  • Nyomtatási forgatókönyvek.

    • Bővíthető alkalmazásjelölési nyelv (XAML) eszköznyomtató nyelvként.

    • Microsoft XPS-dokumentumíró.

    • A korábbi nyomtatóillesztők a Win32-alkalmazások kimenetét rögzített formátumba alakították.

    • Nyomtatási sor formátuma.

  • Rögzített formátumú dokumentumábrázolás, beleértve a korábbi Windows-verziókhoz és más számítástechnikai eszközökhöz készült klienseket is.

Megjegyzés:

Glyphs és GlyphRun rögzített formátumú dokumentumbemutatási és nyomtatási forgatókönyvekhez vannak tervezve. A WPF számos elemet biztosít az általános elrendezési és felhasználói felületi forgatókönyvekhez, például Label és TextBlock. Az elrendezésről és a felhasználói felületi forgatókönyvekről további információt a WPFtipográfiájában talál.

Az alábbi példák bemutatják, hogyan definiálhat tulajdonságokat egy Glyphs objektumhoz az XAML-ben. A példák feltételezik, hogy az Arial, a Courier New és a Times New Roman betűtípus a helyi számítógép C:\WINDOWS\Fonts mappájába van telepítve.

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

A DrawGlyphRun használata

Ha egyéni vezérlőt használ, és karakterjeleket szeretne megjeleníteni, használja a DrawGlyphRun metódust.

A WPF alacsonyabb szintű szolgáltatásokat is biztosít az egyéni szövegformázáshoz a FormattedText objektum használatával. A Szöveg renderelésének leghatékonyabb módja a Windows Presentation Foundationben (WPF) a szövegtartalom glyph szinten történő generálása Glyphs és GlyphRunhasználatával. Ennek a hatékonyságnak a költsége azonban a könnyen használható szövegformázás elvesztése, amely a Windows Presentation Foundation (WPF) vezérlők beépített funkciói, például TextBlock és FlowDocument.

Formázott szövegobjektum

A FormattedText objektum lehetővé teszi többsoros szöveg rajzolására, amelyben a szöveg minden karaktere külön-külön formázható. További információért lásd: Formázott szöveg.

Formázott szöveg létrehozásához hívja meg a FormattedText konstruktort egy FormattedText objektum létrehozásához. Miután létrehozta a kezdeti formázott szöveges sztringet, számos formázási stílust alkalmazhat. Ha az alkalmazás saját elrendezést szeretne implementálni, akkor a FormattedText objektum jobb választás, mint egy vezérlő használata, például TextBlock. Az FormattedText objektumról további információt Formázott szöveg című témakörben talál.

A FormattedText objektum alacsony szintű szövegformázási képességet biztosít. Több formázási stílust is alkalmazhat egy vagy több karakterre. Meghívhatja például a SetFontSize és a SetForegroundBrush metódust is a szöveg első öt karakterének formázásának módosításához.

Az alábbi példakód létrehoz egy FormattedText objektumot, és megjeleníti azt.

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 és Label vezérlők

A WPF több vezérlőt is tartalmaz, amelyekkel szöveget rajzolhat a képernyőre. Minden vezérlő más-más forgatókönyvre irányul, és saját funkciókkal és korlátozásokkal rendelkezik.

A FlowDocument jobban befolyásolja a teljesítményt, mint a TextBlock vagy a Címke

Általában a TextBlock elemet kell használni, ha korlátozott szövegtámogatásra van szükség, például egy rövid mondatot egy felhasználói felületen (UI). Label akkor használható, ha minimális szövegtámogatásra van szükség. A FlowDocument elem olyan újrafolyatható dokumentumok tárolója, amelyek támogatják a tartalom gazdag megjelenítését, ezért nagyobb teljesítményre van hatással, mint a TextBlock vagy Label vezérlők használata.

További információért a(z) FlowDocument-ról/ről tekintse meg a(z) Folyamatdokumentum Áttekintésecímű részt.

A TextBlock használatának elkerülése a FlowDocumentben

A TextBlock elem UIElementszármazik. A Run elem TextElementszármazik, amely kevésbé költséges, mint egy UIElement-származtatott objektum. Ha lehetséges, Run helyett TextBlock használjon a FlowDocumentszöveges tartalmainak megjelenítéséhez.

Az alábbi korrektúraminta a szöveges tartalom FlowDocumentbelüli beállításának két módját mutatja be:

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

A szövegtulajdonságok beállításának mellőzése a Futtatás funkcióval

Általánosságban elmondható, hogy egy Run-ben lévő TextBlock használata teljesítményigényesebb, mintha egyáltalán nem használunk explicit Run objektumot. Ha a Run-t használja a szövegtulajdonságok beállításához, állítsa be ezeket a tulajdonságokat közvetlenül a TextBlock-re.

Az alábbi korrektúraminta a szövegtulajdonságok beállításának két módját mutatja be, ebben az esetben a FontWeight tulajdonságot:

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

Az alábbi táblázat az 1000 TextBlock objektum explicit Runés anélkül való megjelenítésének költségét mutatja.

TextBlock-típus létrehozási idő (ms) renderelési idő (ms)
Szövegtulajdonságok beállítása 146 540
TextBlock – szövegtulajdonságok beállítása 43 453

Kerülje a Label.Content tulajdonsághoz való adatkötést

Képzeljen el egy forgatókönyvet, amelyben egy Label objektum van, amely gyakran frissül egy String forrásból. Ha az adat a Label elem Content tulajdonságát a String forrásobjektumhoz köti, gyenge teljesítményt tapasztalhat. A forrás String frissítésekor a rendszer elveti a régi String objektumot, és új String hoz létre – mivel egy String objektum nem módosítható, nem módosítható. Ez viszont azt eredményezi, hogy az ContentPresenter objektum Label elveti a régi tartalmát, és újragenerálja az új tartalmat az új Stringmegjelenítéséhez.

A probléma megoldása egyszerű. Ha a Label nincs egyéni ContentTemplate értékre állítva, cserélje le a Label egy TextBlock-ra, és a Text tulajdonságát kösse a forrássztringhez.

Adathoz kötött tulajdonság frissítési idő (ms)
Címke.Tartalom 835
TextBlock.Szöveg 242

A Hyperlink objektum egy beágyazott szintű folyamattartalom-elem, amely lehetővé teszi, hogy hivatkozásokat tároljon a folyamat tartalmán belül.

Több Hyperlink elem használatát is optimalizálhatja, ha ugyanabban a TextBlockcsoportosítja őket. Ez segít minimalizálni az alkalmazásban létrehozott objektumok számát. Előfordulhat például, hogy több hivatkozást szeretne megjeleníteni, például a következőket:

MSN Kezdőlap | Saját MSN

Az alábbi korrektúra-példa több TextBlock elemet mutat be a hivatkozások megjelenítéséhez:

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

Az alábbi korrektúra-példa a hivatkozások hatékonyabb megjelenítését mutatja be, ezúttal egyetlen TextBlockhasználatával:

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

A TextDecoration objektum egy vizuális díszítőelem, amelyet hozzáadhat a szöveghez; azonban a példányosítás teljesítményigényes lehet. Ha széles körben használja Hyperlink elemeket, fontolja meg az aláhúzás megjelenítését, ha eseményt indít el, például az MouseEnter eseményt. További információért lásd: Határozza meg, hogy alá van-e húzva a hivatkozás.

Az alábbi képen látható, hogy a MouseEnter esemény hogyan aktiválja az aláhúzott hivatkozást:

Hivatkozások, amelyek szövegdekorációkat jelenítenek meg

Az alábbi kódrészlet egy Hyperlink definiálását mutatja be aláhúzással és aláhúzás nélkül.

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

Az alábbi táblázat az 1000 Hyperlink elem aláhúzással és aláhúzás nélkül történő megjelenítésének teljesítményköltségét mutatja.

Hiperhivatkozás létrehozási idő (ms) renderelési idő (ms)
Aláhúzással 289 1130
Aláhúzás nélkül 299 776

Szövegformázási funkciók

A WPF részletes szövegformázási szolgáltatásokat, például automatikus elválasztást biztosít. Ezek a szolgáltatások hatással lehetnek az alkalmazások teljesítményére, és csak szükség esetén használhatók.

Az elválasztás szükségtelen használatának elkerülése

Az automatikus elválasztás megkeresi a szövegsorok kötőjel-töréspontjait, és lehetővé teszi a TextBlock és FlowDocument objektumok vonalainak további törési pozícióit. Alapértelmezés szerint az automatikus elválasztás le van tiltva ezekben az objektumokban. Ezt a funkciót úgy engedélyezheti, hogy az objektum IsHyphenationEnabled tulajdonságát trueértékre állítja. A funkció engedélyezésével azonban a WPF elindítja a komponensobjektum-modell (COM) együttműködését, ami hatással lehet az alkalmazások teljesítményére. Javasoljuk, hogy ne használja az automatikus elválasztást, hacsak nincs rá szüksége.

Ábrák körültekintő használata

A Figure elem a folyamattartalom egy részét jelöli, amely teljesen elhelyezhető a tartalomoldalon. Bizonyos esetekben a Figure egy teljes oldal automatikus újraformázását okozhatja, ha a pozíciója ütközik a már elrendezett tartalommal. Minimalizálhatja a szükségtelen újraformázás lehetőségét, ha csoportosítja Figure elemeket egymás mellett, vagy deklarálja őket a tartalom tetején egy rögzített oldalméretű forgatókönyvben.

Optimális bekezdés

A FlowDocument objektum optimális bekezdésfunkciója a bekezdéseket úgy helyezi el, hogy a szabad terület a lehető legegyensúlyosabban oszlik el. Alapértelmezés szerint az optimális bekezdés funkció le van tiltva. Ezt a funkciót úgy engedélyezheti, hogy az objektum IsOptimalParagraphEnabled tulajdonságát trueértékre állítja. A funkció engedélyezése azonban hatással van az alkalmazás teljesítményére. Javasoljuk, hogy csak akkor használja az optimális bekezdés funkciót, ha szüksége van rá.

Lásd még