Performansı İyileştirme: Metin
WPF, Özellik zengin Kullanıcı arabirimi (UI) denetimleri kullanılarak metin içeriğinin sunumu için destek içerir. Genel olarak, metin işlemesini üç katmanda ayırabilirsiniz:
Nesnesini kullanarak FormattedText .
Ve nesneleri gibi üst düzey denetimleri kullanma TextBlockFlowDocument .
Bu konu, metin işleme performans önerileri sağlar.
Glif düzeyinde metin işleme
Windows Presentation Foundation (WPF), Glyphs biçimlendirmeden sonra metni kesme ve kalıcı hale getirmek isteyen müşterilere doğrudan erişim ile glif düzeyinde biçimlendirme dahil gelişmiş metin desteği sağlar. Bu özellikler, aşağıdaki senaryolardan her birinde farklı metin işleme gereksinimleri için kritik destek sağlar.
Sabit biçimli belgelerin ekran görüntüsü.
Yazdırma senaryoları.
Cihaz yazıcı dili olarak Extensible Application Markup Language (XAML).
Microsoft XPS Belge Yazıcısı.
Önceki yazıcı sürücüleri, Win32 uygulamalarından sabit biçime çıkış.
Yazdırma kuyruğu biçimi.
Windows ve diğer bilgi işlem cihazlarının önceki sürümleri için istemciler dahil olmak üzere sabit biçimli belge temsili.
Not
Glyphs ve GlyphRun sabit biçimli belge sunumu ve yazdırma senaryoları için tasarlanmıştır. Windows Presentation Foundation (WPF), ve gibi genel düzen ve kullanıcı arabirimi (uı) senaryoları için çeşitli öğeler Label sağlar TextBlock . Düzen ve Kullanıcı arabirimi senaryoları hakkında daha fazla bilgi için WPF 'de tipografi'e bakın.
Aşağıdaki örneklerde Glyphs Extensible Application Markup Language (XAML) içindeki bir nesne için özelliklerin nasıl tanımlanacağı gösterilmektedir. GlyphsNesnesi, XAML içindeki çıktısını temsil eder GlyphRun . Örneklerde, yerel bilgisayardaki c:\Windows\Fonts klasöründe Arial, Courier New ve Times New Roman yazı tiplerinin yüklendiği varsayılır.
<!-- 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 kullanma
Özel denetiminiz varsa ve glifleri işlemek istiyorsanız DrawGlyphRun yöntemini kullanın.
WPF ayrıca nesnenin kullanımı aracılığıyla özel metin biçimlendirmesi için alt düzey hizmetler de sağlar FormattedText . Windows Presentation Foundation (WPF) içinde metin işlemenin en verimli yolu, ve kullanarak glif düzeyinde metin içeriği oluşturmadır GlyphsGlyphRun . ancak, bu verimlilik maliyeti, ve gibi Windows Presentation Foundation (WPF) denetimlerinin yerleşik özellikleri olan zengin metin biçimlendirmesinin kullanımı kolay bir işlemdir TextBlockFlowDocument .
FormattedText nesnesi
FormattedTextNesnesi, metin içindeki her karakterin ayrı ayrı biçimlendirilebileceği çok satırlı metin çizmenizi sağlar. Daha fazla bilgi için bkz. biçimli metin çizme.
Biçimlendirilen metin oluşturmak için, FormattedText bir nesnesi oluşturmak için oluşturucuyu çağırın FormattedText . İlk biçimlendirilmiş metin dizesini oluşturduktan sonra bir dizi biçimlendirme stili uygulayabilirsiniz. Uygulamanız kendi yerleşimini uygulamak istiyorsa,, gibi FormattedText bir denetim kullanmaktan daha iyi bir seçenektir TextBlock . Nesnesi hakkında daha fazla bilgi için FormattedText bkz. FormattedText .
FormattedTextNesnesi alt düzey metin biçimlendirme yeteneği sağlar. Bir veya daha fazla karaktere birden çok biçimlendirme stili uygulayabilirsiniz. Örneğin, SetFontSizeSetForegroundBrush metin içindeki ilk beş karakterin biçimlendirmesini değiştirmek için ve yöntemlerini çağırabilirsiniz.
Aşağıdaki kod örneği bir nesnesi oluşturur FormattedText ve onu işler.
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 ve Label denetimleri
WPF, ekrana metin çizme için birden çok denetim içerir. Her denetim farklı bir senaryoya yöneliktir ve kendi özellik ve kısıtlama listesine sahiptir.
FlowDocument, performansı TextBlock veya Label 'tan daha fazla etkiler
Genel olarak, TextBlock bir kullanıcı arabiriminde (UI) kısa bir cümle gibi sınırlı metin desteği gerektiğinde öğesi kullanılmalıdır. Label en az metin desteği gerekli olduğunda kullanılabilir. FlowDocumentÖğesi, zengin içerik sunumunu destekleyen ve bu nedenle, veya denetimlerini kullanmaktan daha fazla performans etkisi olan, yeniden Flowable belgeler için bir kapsayıcıdır TextBlockLabel .
hakkında daha fazla bilgi için FlowDocument bkz. FlowDocument.
FlowDocument 'de TextBlock kullanmaktan kaçının
TextBlockÖğesi öğesinden türetilir UIElement . RunÖğesi, TextElement türetilmiş bir nesneden daha az maliyetli olan öğesinden türetilir UIElement . Mümkün olduğunda, ' RunTextBlock deki metin içeriğini görüntülemek için yerine kullanın FlowDocument .
Aşağıdaki biçimlendirme örneği, içindeki metin içeriğini ayarlamanın iki yolunu gösterir 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>
Metin özelliklerini ayarlamak için çalıştırma kullanmaktan kaçının
Genel olarak, bir içinde bir kullanmak, RunTextBlock açık bir nesne kullanmaktan daha yoğun bir performans açısından daha hızlıdır Run . RunMetin özelliklerini ayarlamak için bir kullanıyorsanız, bunun yerine doğrudan bu özellikleri ayarlayın TextBlock .
Aşağıdaki biçimlendirme örneği, bir metin özelliğini ayarlamanın iki yolunu gösterir, bu durumda FontWeight özelliği:
<!-- 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>
Aşağıdaki tabloda, TextBlock açık ve olmadan 1000 nesnelerinin görüntüleme maliyeti gösterilmektedir Run .
| TextBlock türü | Oluşturma zamanı (MS) | İşleme süresi (MS) |
|---|---|---|
| Çalışma ayarı metin özellikleri | 146 | 540 |
| TextBlock ayarı metin özellikleri | 43 | 453 |
Label. Content özelliğine veri bağlamayı önleyin
Labelbir kaynaktan sık güncellenen bir nesneniz olan bir senaryo Imagine String . Veri, Label öğenin Content özelliğini String Kaynak nesneye bağladığınızda, performansı düşük olabilir. Kaynak her güncelleştirildiği zaman String , eski String nesne atılır ve yeni bir yeniden String oluşturulur, çünkü bir String nesne sabit olduğu için değiştirilemez. Bu, buna karşılık, ContentPresenterLabel nesnesinin eski içeriğini atıp yeni içeriği yeniden oluşturmak için yeni içerik oluşturmasına neden olur String .
Bu soruna yönelik çözüm basittir. LabelÖzel bir değere ayarlanmamışsa, ContentTemplate öğesini Label ile TextBlock ve veri bağlama Text özelliğini kaynak dizeye değiştirin.
| Veri bağlantılı özelliği | Güncelleştirme zamanı (MS) |
|---|---|
| Etiket. Içerik | 835 |
| TextBlock. Text | 242 |
Köprü
HyperlinkNesnesi, akış içeriği içinde köprüler barındırmanıza olanak sağlayan satır içi düzey bir akış içerik öğesidir.
Köprüleri tek bir TextBlock nesnesinde birleştirme
Birden çok öğenin kullanımını aynı şekilde bir Hyperlink araya getirerek iyileştirebilirsiniz TextBlock . Bu, uygulamanızda oluşturduğunuz nesne sayısını en aza indirmenize yardımcı olur. Örneğin, aşağıdakiler gibi birden çok köprü görüntülenmesini isteyebilirsiniz:
MSN giriş sayfası | My MSN
Aşağıdaki biçimlendirme örneği, TextBlock köprüleri göstermek için kullanılan birden çok öğeyi göstermektedir:
<!-- 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>
Aşağıdaki biçimlendirme örneği, bu kez, tek bir kullanarak köprüleri görüntülemenin daha verimli bir yolunu göstermektedir 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>
Yalnızca MouseEnter olaylarında köprülerde alt çizgiler gösteriliyor
Bir TextDecoration nesne, metne ekleyebileceğiniz görsel bir görüntü oluşturur; ancak, örneği oluşturmak için performansı yoğun hale getirebilirsiniz. Öğelerin yoğun kullanımını yaparsanız, Hyperlink olay gibi yalnızca bir olay tetiklendiğinde alt çizgiyi göstermeyi düşünün MouseEnter . Daha fazla bilgi için bkz. bir köprünün altı çizili olup olmadığını belirtme.
Aşağıdaki görüntüde, MouseEnter olayının altı çizili köprü nasıl tetiklediği gösterilmektedir:

Aşağıdaki biçimlendirme örneği, Hyperlink ile tanımlanmış bir ve altı çizili olmayan bir şekilde gösterir:
<!-- 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>
Aşağıdaki tabloda, altı çizili olmayan 1000 öğelerinin görüntülenmesi için performans maliyeti gösterilmektedir Hyperlink .
| Köprü | Oluşturma zamanı (MS) | İşleme süresi (MS) |
|---|---|---|
| Altı çizili | 289 | 1130 |
| Altı çizili olmadan | 299 | 776 |
Metin biçimlendirme özellikleri
WPF, Otomatik hecelere benzer zengin metin biçimlendirme hizmetleri sağlar. Bu hizmetler, uygulama performansını etkileyebilir ve yalnızca gerektiğinde kullanılmalıdır.
Gereksiz heceleme kullanımını önleyin
Otomatik heceleme metin satırları için kısa çizgi kesme noktaları bulur ve ve nesnelerinde çizgiler için ek kesme konumlarına izin verir TextBlockFlowDocument . Varsayılan olarak, otomatik heceleme özelliği bu nesnelerde devre dışıdır. Nesnenin ısshationenabled özelliğini olarak ayarlayarak bu özelliği etkinleştirebilirsiniz true . Ancak, bu özelliği etkinleştirmek WPF 'nin uygulama performansını etkileyebilecek bileşen nesne modeli (COM) birlikte çalışabilirliği başlatmasına neden olur. İhtiyaç duymadığınız takdirde otomatik hecelemeyi kullanmanız önerilir.
Rakamları dikkatle kullanın
Bir Figure öğe, bir içerik sayfasında mutlak olarak konumlandırılmış akış içeriğinin bir kısmını temsil eder. Bazı durumlarda, Figure konumu zaten değiştirilmiş içerikle çakışıyorsa bir sayfanın tamamının otomatik olarak yeniden biçimlendirmeye neden olabilir. Figure Birbirini izleyen veya bir sabit sayfa boyutu senaryosunda içeriğin üst kısmına yaklaşarak, gereksiz yeniden biçimlendirme olasılığını en aza indirmenize olanak sağlayabilirsiniz.
En iyi paragraf
Nesnenin en iyi paragraf özelliği, FlowDocument Beyaz alanın mümkün olduğunca eşit şekilde dağıtılması için paragrafları yerleştirir. Varsayılan olarak, en uygun paragraf özelliği devre dışıdır. Nesnenin özelliğini olarak ayarlayarak bu özelliği etkinleştirebilirsiniz IsOptimalParagraphEnabledtrue . Ancak, bu özelliğin etkinleştirilmesi uygulama performansını etkiler. İhtiyaç duymadığınız takdirde en iyi paragraf özelliğini kullanmanız önerilir.