Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
A FormattedText objektum használata.
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 WPF
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 |
Hivatkozás
A Hyperlink objektum egy beágyazott szintű folyamattartalom-elem, amely lehetővé teszi, hogy hivatkozásokat tároljon a folyamat tartalmán belül.
Hivatkozások egyesítése a One TextBlock objektumban
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>
Aláhúzások megjelenítése csak akkor, amikor az egér a hivatkozások fölé mozog
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:
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
.NET Desktop feedback