Performansı İyileştirme: Metin
WPF, zengin özellik kullanıcı arabirimi (UI) denetimleri kullanarak metin içeriğinin sunulması için destek içerir. Genel olarak, metin işlemeyi üç katmana bölebilirsiniz:
FormattedText nesnesini kullanma.
ve FlowDocument nesneleri gibi TextBlock üst düzey denetimleri kullanma.
Bu konu başlığında metin işleme performansı önerileri sağlanır.
Karakter Düzeyinde Metin İşleme
Windows Presentation Foundation (WPF), biçimlendirmeden sonra metinleri kesmek ve kalıcı hale getirmek isteyen müşteriler için doğrudan erişimi Glyphs olan karakter düzeyi işaretleme dahil olmak üzere gelişmiş metin desteği sağlar. Bu özellikler, aşağıdaki senaryoların 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 Genişletilebilir Uygulama biçimlendirme dili (XAML).
Microsoft XPS Belge Yazıcı.
Önceki yazıcı sürücüleri, Win32 uygulamalarından sabit biçime çıktı.
Yazdırma biriktiricisi biçimi.
Windows'un önceki sürümlerine ve diğer bilgi işlem cihazlarına yönelik istemciler de dahil olmak üzere sabit biçimli belge gösterimi.
Dekont
Glyphs ve GlyphRun sabit biçimli belge sunusu ve yazdırma senaryoları için tasarlanmıştır. WPF, ve TextBlockgibi Label genel düzen ve kullanıcı arabirimi (UI) senaryoları için çeşitli öğeler sağlar. Düzen ve kullanıcı arabirimi senaryoları hakkında daha fazla bilgi için bkz . WPF'de Tipografi.
Aşağıdaki örneklerde, XAML'de bir Glyphs nesne için özelliklerin nasıl tanımlanacağı gösterilmektedir. Örneklerde Arial, Courier New ve Times New Roman yazı tiplerinin yerel bilgisayardaki C:\WINDOWS\Fonts klasörüne 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 yöntemini kullanın DrawGlyphRun .
WPF ayrıca nesnenin FormattedText kullanımı aracılığıyla özel metin biçimlendirmesi için alt düzey hizmetler sağlar. Windows Presentation Foundation'da (WPF) metin işlemenin en verimli yolu, ve GlyphRunkullanarak Glyphs karakter düzeyinde metin içeriği oluşturmaktır. Ancak bu verimliliğin maliyeti, ve FlowDocumentgibi TextBlock Windows Presentation Foundation (WPF) denetimlerinin yerleşik özellikleri olan kullanımı kolay zengin metin biçimlendirmesinin kaybedilmesidir.
Biçimlendirilmiş Metin Nesnesi
FormattedText nesnesi, metindeki her karakterin ayrı ayrı biçimlendirilebildiği çok satırlı metin çizmenize olanak tanır. Daha fazla bilgi için bkz . Biçimlendirilmiş Metin Çizme.
Biçimlendirilmiş metin oluşturmak için oluşturucuyu çağırarak FormattedText bir FormattedText nesne oluşturun. İlk biçimlendirilmiş metin dizesini oluşturduktan sonra, bir biçimlendirme stilleri aralığı uygulayabilirsiniz. Uygulamanız kendi düzenini uygulamak istiyorsa, FormattedText nesnesi gibi TextBlockbir denetim kullanmaktan daha iyi bir seçimdir. Nesne hakkında FormattedText daha fazla bilgi için bkz . Biçimlendirilmiş Metin Çizme .
FormattedText nesnesi alt düzey metin biçimlendirme özelliği sağlar. Bir veya daha fazla karaktere birden çok biçimlendirme stili uygulayabilirsiniz. Örneğin, metindeki SetFontSize ilk beş karakterin biçimlendirmesini değiştirmek için hem ve SetForegroundBrush yöntemlerini çağırabilirsiniz.
Aşağıdaki kod örneği bir FormattedText nesne oluşturur 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 Etiket Denetimleri
WPF, ekrana metin çizmek için birden çok denetim içerir. Her denetim farklı bir senaryoya hedeflenmiştir ve kendi özellik ve sınırlama listesine sahiptir.
FlowDocument, TextBlock veya Label'dan Daha Fazla Performansı Etkiler
Genel olarak, kullanıcı arabirimindeki TextBlock (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 gerektiğinde kullanılabilir. FlowDocument öğesi, zengin içerik sunumunu destekleyen ve bu nedenle veya Label denetimlerinden daha TextBlock fazla performans etkisine sahip olan, yeniden akışa alınabilen belgelere yönelik bir kapsayıcıdır.
hakkında FlowDocumentdaha fazla bilgi için bkz . Akış Belgesine Genel Bakış.
FlowDocument'da TextBlock Kullanmaktan Kaçının
TextBlock öğesi öğesinden UIElementtüretilir. Run öğesi, -derived nesnesinden daha UIElementaz maliyetli olan öğesinden TextElementtüretilir. Mümkün olduğunda, içinde metin içeriğini FlowDocumentgörüntülemek yerine TextBlock kullanınRun.
Aşağıdaki işaretleme örneği, içinde FlowDocumentmetin içeriği ayarlamanın iki yolunu gösterir:
<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ır'ı Kullanmaktan Kaçının
Genel olarak, içinde bir RunTextBlock kullanmak, açık Run bir nesne kullanmamaktan daha yoğun performans gerektirir. Metin özelliklerini ayarlamak için bir Run kullanıyorsanız, bu özellikleri doğrudan üzerinde TextBlock ayarlayın.
Aşağıdaki işaretleme örneği, bir metin özelliğini ayarlamanın bu iki yolunu (bu örnekte, FontWeight özelliği) gösterir:
<!-- 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, açık bir ile ve olmadan 1000 TextBlock nesne görüntülemenin maliyeti gösterilmektedir Run.
TextBlock türü | Oluşturma zamanı (ms) | İşleme süresi (ms) |
---|---|---|
Metin özelliklerini ayarlamayı çalıştırma | 146 | 540 |
TextBlock ayarı metin özellikleri | 43 | 453 |
Label.Content Özelliğine Veri Bağlamadan Kaçının
Bir kaynaktan sık sık güncelleştirilen bir Label nesneniz olduğu bir String senaryo düşünün. Veri, öğenin Content özelliğini kaynak nesneye String bağlarken Label düşük performansla karşılaşabilirsiniz. Kaynak String her güncelleştirildiğinde, eski String nesne atılır ve yeni String bir nesne yeniden oluşturulur. String Nesne sabit olduğundan değiştirilemez. Bu da nesnenin Label eski içeriğini atıp yeni içeriği yeniden oluşturarak yeni Stringöğesini görüntülemesine neden olurContentPresenter.
Bu sorunun çözümü basittir. Label özel ContentTemplate bir değere ayarlanmadıysa değerini ile TextBlock değiştirin Label ve verileri özelliğini kaynak dizeye bağlayınText.
Veri sınırı özelliği | Güncelleştirme zamanı (ms) |
---|---|
Label.Content | 835 |
TextBlock.Text | 242 |
Köprü
Hyperlink nesnesi, akış içeriğinde köprü barındırmanıza olanak tanıyan satır içi düzeyde bir akış içerik öğesidir.
Bir TextBlock Nesnesinde Köprüleri Birleştirme
Birden çok Hyperlink öğeyi aynı TextBlockiçinde gruplandırarak kullanımını iyileştirebilirsiniz. Bu, uygulamanızda oluşturduğunuz nesne sayısını en aza indirmeye yardımcı olur. Örneğin, aşağıdakiler gibi birden çok köprü görüntülemek isteyebilirsiniz:
MSN Giriş | MSN'im
Aşağıdaki işaretleme örneği, köprüleri görüntülemek için kullanılan birden çok TextBlock öğeyi gösterir:
<!-- 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 işaretleme örneği, bu kez tek TextBlockbir kullanarak köprüleri görüntülemenin daha verimli bir yolunu gösterir:
<!-- 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ı ÇiziliLeri Gösterme
TextDecoration Nesne, metne ekleyebileceğiniz görsel bir süslemedir; ancak örnek oluşturmak performans açısından yoğun olabilir. Öğeleri kapsamlı bir şekilde kullanıyorsanız Hyperlink , yalnızca olay gibi bir olayı tetiklerken alt çizgi göstermeyi MouseEnter göz önünde bulundurun. Daha fazla bilgi için bkz . Köprü altı çizili olup olmadığını belirtme.
Aşağıdaki görüntüde, MouseEnter olayının altı çizili köprüyü nasıl tetiklendiği gösterilmektedir:
Aşağıdaki işaretleme örneği, altı çizili olan ve olmayan bir öğesini gösterir Hyperlink :
<!-- 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 ve altı olmayan 1000 Hyperlink öğe görüntülemenin performans maliyeti gösterilmektedir.
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 hecelemeler gibi 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ından Kaçının
Otomatik heceleme, metin satırları için kısa çizgi kesme noktaları bulur ve ve FlowDocument nesnelerindeki TextBlock satırlar için ek kesme konumlarına izin verir. Varsayılan olarak, otomatik heceleme özelliği bu nesnelerde devre dışı bırakılır. Nesnenin IsHyphenationEnabled özelliğini olarak ayarlayarak bu özelliği true
etkinleştirebilirsiniz. Ancak bu özelliğin etkinleştirilmesi WPF'nin Bileşen Nesne Modeli (COM) birlikte çalışabilirliğini başlatmasına neden olur ve bu da uygulama performansını etkileyebilir. İhtiyacınız olmadığı sürece otomatik heceleme kullanmamanızı öneririz.
Şekilleri Dikkatle Kullanma
Figure Öğe, akış içeriğinin bir içerik sayfası içinde kesinlikle konumlandırılabilir bir bölümünü temsil eder. Bazı durumlarda, Figure konumu önceden yerleştirilmiş içerikle çakılırsa tüm sayfanın otomatik olarak yeniden biçimlendirilmesine neden olabilir. Öğeleri yan yana gruplandırarak Figure veya sabit sayfa boyutu senaryosunda içeriğin üst kısmına doğru bildirerek gereksiz yeniden biçimlendirme olasılığını en aza indirebilirsiniz.
En uygun Paragraf
Nesnenin en uygun paragraf özelliği, boşlukların FlowDocument mümkün olduğunca eşit bir şekilde dağıtıldığı şekilde paragrafları düzenler. Varsayılan olarak, en uygun paragraf özelliği devre dışıdır. Nesnenin IsOptimalParagraphEnabled özelliğini olarak ayarlayarak bu özelliği true
etkinleştirebilirsiniz. Ancak, bu özelliğin etkinleştirilmesi uygulama performansını etkiler. İhtiyacınız olmadığı sürece en uygun paragraf özelliğini kullanmamanızı öneririz.
Ayrıca bkz.
.NET Desktop feedback