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:

  1. Glyphs ve GlyphRun nesnelerini doğrudan kullanma.

  2. FormattedText nesnesini kullanma.

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

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.

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>

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:

Hyperlinks displaying TextDecorations

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 trueetkinleş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 trueetkinleş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.