Gelişmiş Metin Biçimlendirme

Windows Presentation Foundation (WPF), uygulamanıza metin eklemek için sağlam bir API kümesi sağlar. gibi TextBlockdüzen ve kullanıcı arabirimi (UI) API'leri, metin sunumu için en yaygın ve genel kullanım öğelerini sağlar. ve FormattedTextgibi GlyphRunDrawing çizim API'leri, çizimlere biçimlendirilmiş metin eklemek için bir araç sağlar. EN gelişmiş düzeyde WPF, metin deposu yönetimi, metin çalıştırma biçimlendirme yönetimi ve eklenmiş nesne yönetimi gibi metin sunumunun her yönünü denetlemek için genişletilebilir bir metin biçimlendirme altyapısı sağlar.

Bu konu başlığında WPF metin biçimlendirmesine giriş bilgileri sağlanmaktadır. İstemci uygulamasına ve WPF metin biçimlendirme altyapısının kullanımına odaklanır.

Dekont

Bu belgedeki tüm kod örnekleri Gelişmiş Metin Biçimlendirme Örneği'nde bulunabilir.

Ön koşullar

Bu konu başlığında, metin sunumu için kullanılan üst düzey API'leri bildiğiniz varsayılır. Çoğu kullanıcı senaryosu, bu konuda ele alınan gelişmiş metin biçimlendirme API'lerini gerektirmez. Farklı metin API'lerine giriş için bkz . WPF'deki Belgeler.

Gelişmiş Metin Biçimlendirme

WPF'deki metin düzeni ve kullanıcı arabirimi denetimleri, uygulamanıza biçimlendirilmiş metni kolayca eklemenize olanak sağlayan biçimlendirme özellikleri sağlar. Bu denetimler metin sunumunu işlemek için yazı biçimini, boyutunu ve rengini içeren bir dizi özelliği kullanıma sunar. Normal koşullarda, bu denetimler uygulamanızdaki metin sunumunun çoğunu işleyebilir. Ancak, bazı gelişmiş senaryolar hem metin depolamanın hem de metin sunumunun denetimini gerektirir. WPF, bu amaçla genişletilebilir bir metin biçimlendirme altyapısı sağlar.

WPF'de bulunan gelişmiş metin biçimlendirme özellikleri bir metin biçimlendirme altyapısı, metin deposu, metin çalıştırmaları ve biçimlendirme özelliklerinden oluşur. Metin biçimlendirme altyapısı, TextFormattersunu için kullanılacak metin satırları oluşturur. Bu, satır biçimlendirme işlemini başlatarak ve metin biçimlendiricinin FormatLineöğesini çağırarak elde edilir. Metin biçimlendirici, mağazanın GetTextRun yöntemini çağırarak metin deponuzdan çalıştırılan metinleri alır. Nesneler TextRun daha sonra metin biçimlendirici tarafından nesneler halinde TextLine oluşturulur ve inceleme veya görüntüleme için uygulamanıza verilir.

Metin Biçimlendiriciyi Kullanma

TextFormatter WPF metin biçimlendirme altyapısıdır ve metin satırlarını biçimlendirmeye ve kesmeye yönelik hizmetler sağlar. Metin biçimlendirici farklı metin karakter biçimlerini ve paragraf stillerini işleyebilir ve uluslararası metin düzeni desteği içerir.

Geleneksel bir metin API'sinin TextFormatter aksine, bir dizi geri çağırma yöntemi aracılığıyla bir metin düzeni istemcisiyle etkileşim kurar. İstemcinin sınıfın bir uygulamasında bu yöntemleri sağlamasını TextSource gerektirir. Aşağıdaki diyagramda, istemci uygulaması ile TextFormatterarasındaki metin düzeni etkileşimi gösterilmektedir.

Diagram of text layout client and TextFormatter

Metin biçimlendirici, bir uygulaması olan metin deposundan biçimlendirilmiş metin satırlarını TextSourcealmak için kullanılır. Bu, önce yöntemini kullanarak metin biçimlendiricinin bir örneğini Create oluşturarak yapılır. Bu yöntem, metin biçimlendiricinin bir örneğini oluşturur ve en yüksek satır yüksekliği ve genişlik değerlerini ayarlar. Metin biçimlendiricinin bir örneği oluşturulur oluşturulmaz, yöntemi çağrılarak FormatLine satır oluşturma işlemi başlatılır. TextFormatter bir satır oluşturan metin çalıştırmaları için metin ve biçimlendirme parametrelerini almak için metin kaynağına geri çağırır.

Aşağıdaki örnekte, metin depolarını biçimlendirme işlemi gösterilmiştir. TextFormatter nesnesi, metin deposundan metin satırlarını almak ve içine çizim yapmak için metin satırını biçimlendirmek DrawingContextiçin kullanılır.

// Create a DrawingGroup object for storing formatted text.
textDest = new DrawingGroup();
DrawingContext dc = textDest.Open();

// Update the text store.
_textStore.Text = textToFormat.Text;
_textStore.FontRendering = _currentRendering;

// Create a TextFormatter object.
TextFormatter formatter = TextFormatter.Create();

// Format each line of text from the text store and draw it.
while (textStorePosition < _textStore.Text.Length)
{
   // Create a textline from the text store using the TextFormatter object.
   using (TextLine myTextLine = formatter.FormatLine(
       _textStore,
       textStorePosition,
       96*6,
       new GenericTextParagraphProperties(_currentRendering),
       null))
   {
       // Draw the formatted text into the drawing context.
       myTextLine.Draw(dc, linePosition, InvertAxes.None);

       // Update the index position in the text store.
       textStorePosition += myTextLine.Length;

       // Update the line position coordinate for the displayed line.
       linePosition.Y += myTextLine.Height;
   }
}

// Persist the drawn text content.
dc.Close();

// Display the formatted text in the DrawingGroup object.
myDrawingBrush.Drawing = textDest;
' Create a DrawingGroup object for storing formatted text.
textDest = New DrawingGroup()
Dim dc As DrawingContext = textDest.Open()

' Update the text store.
_textStore.Text = textToFormat.Text
_textStore.FontRendering = _currentRendering

' Create a TextFormatter object.
Dim formatter As TextFormatter = TextFormatter.Create()

' Format each line of text from the text store and draw it.
Do While textStorePosition < _textStore.Text.Length
   ' Create a textline from the text store using the TextFormatter object.
   Using myTextLine As TextLine = formatter.FormatLine(_textStore, textStorePosition, 96*6, New GenericTextParagraphProperties(_currentRendering), Nothing)
       ' Draw the formatted text into the drawing context.
       myTextLine.Draw(dc, linePosition, InvertAxes.None)

       ' Update the index position in the text store.
       textStorePosition += myTextLine.Length

       ' Update the line position coordinate for the displayed line.
       linePosition.Y += myTextLine.Height
   End Using
Loop

' Persist the drawn text content.
dc.Close()

' Display the formatted text in the DrawingGroup object.
myDrawingBrush.Drawing = textDest

İstemci Metin Deposu'nu Uygulama

Metin biçimlendirme altyapısını genişlettiğiniz zaman, metin deposunun tüm yönlerini uygulamanız ve yönetmeniz gerekir. Bu önemsiz bir görev değildir. Metin deposu metin çalıştırma özelliklerini, paragraf özelliklerini, eklenmiş nesneleri ve diğer benzer içerikleri izlemekle sorumludur. Ayrıca, metin biçimlendiricinin nesneleri oluşturmak TextLine için kullandığı tek tek TextRun nesnelerle birlikte metin biçimlendiricisini sağlar.

Metin deposunun sanallaştırılmasını işlemek için, metin deposu'ndan TextSourcetüretilmelidir. TextSource metin biçimlendiricisinin metin deposundan metin çalıştırmalarını almak için kullandığı yöntemi tanımlar. GetTextRun , metin biçimlendiricisi tarafından satır biçimlendirmesinde kullanılan metin çalıştırmalarını almak için kullanılan yöntemdir. çağrısı GetTextRun , aşağıdaki koşullardan biri gerçekleşene kadar metin biçimlendirici tarafından tekrar tekrar yapılır:

  • Bir TextEndOfLine veya alt sınıf döndürülür.

  • Metin çalıştırmalarının birikmiş genişliği, metin biçimlendiriciyi oluşturma çağrısında veya metin biçimlendiricinin FormatLine yöntemine yapılan çağrıda belirtilen en yüksek satır genişliğini aşıyor.

  • "CF", "LF" veya "CRLF" gibi bir Unicode yeni satır dizisi döndürülür.

Metin Çalıştırmaları Sağlama

Metin biçimlendirme işleminin temeli, metin biçimlendirici ile metin deposu arasındaki etkileşimdir. uygulamanız TextSource , metin biçimlendiricisine TextRun nesneleri ve metnin biçimlendirildiği özellikleri sağlar. Bu etkileşim, metin biçimlendiricisi tarafından GetTextRun çağrılan yöntemiyle işlenir.

Aşağıdaki tabloda önceden tanımlanmış TextRun nesnelerden bazıları gösterilmektedir.

TextRun Türü Kullanım
TextCharacters Karakter karakter karakterlerinin bir gösterimini metin biçimlendiriciye geri geçirmek için kullanılan özelleştirilmiş metin çalıştırması.
TextEmbeddedObject Ölçü, isabet testi ve çizimin metin içindeki bir düğme veya resim gibi bütün olarak yapıldığı içeriği sağlamak için kullanılan özelleştirilmiş metin çalıştırması.
TextEndOfLine Bir satırın sonunu işaretlemek için kullanılan özel metin çalıştırması.
TextEndOfParagraph Paragrafın sonunu işaretlemek için kullanılan özel metin çalıştırması.
TextEndOfSegment Önceki çalıştırmadan etkilenen TextModifier kapsamı sonlandırmak gibi bir segmentin sonunu işaretlemek için kullanılan özel metin çalıştırması.
TextHidden Gizli karakter aralığını işaretlemek için kullanılan özel metin çalıştırması.
TextModifier Metnin özelliklerini değiştirmek için kullanılan özelleştirilmiş metin çalıştırması, kendi kapsamında çalışır. Kapsam, sonraki eşleşen TextEndOfSegment metin çalıştırmasına veya sonrakine TextEndOfParagraphgenişletir.

Önceden tanımlanmış TextRun nesnelerden herhangi biri alt sınıflandırılabilir. Bu, metin kaynağınızın metin biçimlendiriciye özel veriler içeren metin çalıştırmaları sağlamasına olanak tanır.

Aşağıdaki örnekte bir GetTextRun yöntem gösterilmektedir. Bu metin deposu, nesneleri işlemek üzere metin biçimlendiricisine döndürür TextRun .

// Used by the TextFormatter object to retrieve a run of text from the text source.
public override TextRun GetTextRun(int textSourceCharacterIndex)
{
   // Make sure text source index is in bounds.
   if (textSourceCharacterIndex < 0)
      throw new ArgumentOutOfRangeException("textSourceCharacterIndex", "Value must be greater than 0.");
   if (textSourceCharacterIndex >= _text.Length)
   {
      return new TextEndOfParagraph(1);
   }

   // Create TextCharacters using the current font rendering properties.
   if (textSourceCharacterIndex < _text.Length)
   {
      return new TextCharacters(
         _text,
         textSourceCharacterIndex,
         _text.Length - textSourceCharacterIndex,
         new GenericTextRunProperties(_currentRendering));
   }

   // Return an end-of-paragraph if no more text source.
   return new TextEndOfParagraph(1);
}
' Used by the TextFormatter object to retrieve a run of text from the text source.
Public Overrides Function GetTextRun(ByVal textSourceCharacterIndex As Integer) As TextRun
   ' Make sure text source index is in bounds.
   If textSourceCharacterIndex < 0 Then
      Throw New ArgumentOutOfRangeException("textSourceCharacterIndex", "Value must be greater than 0.")
   End If
   If textSourceCharacterIndex >= _text.Length Then
      Return New TextEndOfParagraph(1)
   End If

   ' Create TextCharacters using the current font rendering properties.
   If textSourceCharacterIndex < _text.Length Then
      Return New TextCharacters(_text, textSourceCharacterIndex, _text.Length - textSourceCharacterIndex, New GenericTextRunProperties(_currentRendering))
   End If

   ' Return an end-of-paragraph if no more text source.
   Return New TextEndOfParagraph(1)
End Function

Dekont

Bu örnekte, metin deposu metnin tümüne aynı metin özelliklerini sağlar. Gelişmiş metin depolarının, tek tek karakterlerin farklı özelliklere sahip olmasını sağlamak için kendi yayılma alanı yönetimini uygulaması gerekir.

Biçimlendirme Özelliklerini Belirtme

TextRun nesneleri, metin deposu tarafından sağlanan özellikler kullanılarak biçimlendirilir. Bu özellikler ve olmak üzere iki türde TextParagraphPropertiesTextRunPropertiesgelir. TextParagraphPropertiesve FlowDirectiongibi TextAlignment paragraf dahil özelliklerini işleyin. TextRunProperties , ön plan fırçası Typefaceve yazı tipi boyutu gibi bir paragraf içinde çalıştırılacak her metin için farklı olabilecek özelliklerdir. Özel paragraf ve özel metin çalıştırma özellik türlerini uygulamak için uygulamanızın sırasıyla ve'den TextParagraphPropertiesTextRunProperties türetilen sınıflar oluşturması gerekir.

Ayrıca bkz.