Aracılığıyla paylaş


Performansı İyi hale getirme: 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. Üst düzey denetimleri, TextBlock ve FlowDocument nesneleri gibi kullanmak.

Bu konu başlığında metin işleme performansı önerileri sağlanır.

Glif Düzeyinde Metin İşleme

Windows Presentation Foundation (WPF), karakter düzeyinde işaretleme ve biçimlendirmeden sonra metni yakalayıp kalıcı hale getirmek isteyen müşteriler için Glyphs'a doğrudan erişim sağlayan 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 yapılan çıktıları sabit bir biçime dönüştürüyordu.

    • Yazdırma kuyruğu 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.

Uyarı

Glyphs ve GlyphRun sabit biçimli belge sunusu ve yazdırma senaryoları için tasarlanmıştır. WPF, genel düzen ve kullanıcı arabirimi (UI) senaryoları için Label ve TextBlock gibi ç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 nesnesi 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 Kullanımı

Ö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, Glyphs ve GlyphRun kullanarak karakter düzeyinde metin içeriği oluşturmaktır. Ancak bu verimliliğin maliyeti, TextBlock ve FlowDocument gibi Windows Presentation Foundation (WPF) kontrolünün 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. Daha fazla bilgi için FormattedText nesnesine bakınız, 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 ilk beş karakterin biçimlendirmesini değiştirmek için hem SetFontSize hem de SetForegroundBrush yöntemlerini çağırabilirsiniz.

Aşağıdaki kod örneği bir FormattedText nesnesi oluşturur ve onu görüntü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, TextBlock öğesi, kullanıcı arabiriminde (UI) kısa bir cümle gibi sınırlı metin desteği gerektiğinde kullanılmalıdır. Label en az metin desteği gerektiğinde kullanılabilir. FlowDocument öğesi, zengin içerik sunumunu destekleyen yeniden akışa alınabilen belgelere yönelik bir kapsayıcıdır ve bu nedenle TextBlock veya Label denetimlerinden daha yüksek bir performans etkisine sahiptir.

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, TextElement öğesinden türetilmiştir; bu, UIElement türetilmiş bir nesneye kıyasla kullanımı daha az maliyetlidir. Mümkün olduğunda, içinde metin içeriğini Rungörüntülemek yerine TextBlock kullanınFlowDocument.

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 bağlarken, Label öğesinin Content özelliğini String kaynak nesneye bağladığınızda 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 ContentPresenter eski içeriğini atıp yeni içeriği yeniden oluşturarak yeni Labelöğesini görüntülemesine neden olurString.

Bu sorunun çözümü basittir. Eğer Label özel ContentTemplate bir değere ayarlanmadıysa, Label değerini bir TextBlock ile değiştirin ve Text özelliğini kaynak dizeye veri bağlayın.

Veri sınırı özelliği Güncelleştirme zamanı (ms)
Etiket.İçerik 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 oluşturulması performans açısından maliyetli 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. 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üyü nasıl tetiklendiği gösterilmektedir:

Metin Süslemeleri gösteren köprüler

Aşağıdaki işaretleme örneği, altı çizili ve çizgisiz olarak tanımlanmış bir Hyperlink'ı 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 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 TextBlock ve FlowDocument nesnelerindeki 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'ün konumu, önceden yerleştirilmiş içerikle çakıştığında, tüm sayfanın otomatik olarak yeniden biçimlendirilmesine neden olabilir. Gereksiz yeniden biçimlendirme olasılığını, Figure öğelerini yan yana gruplandırarak veya sabit sayfa boyutu senaryolarında, içeriğin üst kısmında bildirimde bulunarak en aza indirebilirsiniz.

En uygun Paragraf

FlowDocument nesnesinin en uygun paragraf özelliği, boşlukları mümkün olduğunca eşit bir şekilde dağıtarak paragrafları düzenler. Varsayılan olarak, en uygun paragraf özelliği devre dışıdır. Nesnenin IsOptimalParagraphEnabled özelliğini true olarak ayarlayarak bu özelliği etkinleştirebilirsiniz. Ancak, bu özelliğin etkinleştirilmesi uygulama performansını etkiler. Bir ihtiyaç olmadıkça en uygun paragraf özelliğini kullanmamanızı önermekteyiz.

Ayrıca bakınız