Gelişmiş Metin Biçimlendirme
Windows Presentation Foundation (WPF), uygulamanıza metin dahil etmek için güçlü bir apı kümesi sağlar. Düzen ve Kullanıcı arabirimi (UI) API 'Leri gibi, TextBlock metin sunumu için en yaygın ve genel kullanım öğeleri sağlar. Ve gibi çizim API 'Leri GlyphRunDrawing , FormattedText çizimlerde biçimlendirilen metin ekleme için bir yol sağlar. WPF, en gelişmiş düzeyde metin kopyası yönetimi, metin çalışma biçimlendirme yönetimi ve katıştırılmış nesne yönetimi gibi metin sunumunun her yönüyle kontrol etmek için genişletilebilir bir metin biçimlendirme altyapısı sağlar.
Bu konuda WPF metin biçimlendirmeye giriş sağlanır. İstemci uygulamasına odaklanır ve WPF metin biçimlendirme altyapısının kullanımını kullanır.
Not
Bu belgedeki tüm kod örnekleri, Gelişmiş metin biçimlendirme örneğindebulunabilir.
Önkoşullar
Bu konu başlığı altında, metin sunumu için kullanılan yüksek düzey API 'lerle ilgili bilgi sahibi olduğunuz varsayılır. Çoğu Kullanıcı senaryosunda, bu konuda ele alınan Gelişmiş metin biçimlendirme API 'Leri gerekli değildir. Farklı metin API 'Lerine giriş için bkz. WPF Içindeki belgeler.
Gelişmiş Metin Biçimlendirme
WPF 'deki metin düzeni ve UI denetimleri, uygulamanıza biçimlendirilmiş metni kolayca eklemenize olanak tanıyan biçimlendirme özellikleri sağlar. Bu denetimler, yazı biçimini, boyutunu ve rengini içeren metin sunumunu işlemek için bir dizi özellik sunar. Normal koşullarda, bu denetimler uygulamanızdaki metin sunumunun çoğunu işleyebilir. Ancak, bazı gelişmiş senaryolar metin depolamanın ve metin sunumunun denetimini gerektirir. WPF, bu amaçla bir Genişletilebilir metin biçimlendirme altyapısı sağlar.
WPF 'de bulunan Gelişmiş metin biçimlendirme özellikleri, metin biçimlendirme motoru, metin deposu, metin çalıştırmaları ve biçimlendirme özelliklerinden oluşur. Metin biçimlendirme altyapısı, TextFormatter sunum için kullanılacak metin satırları oluşturur. Bu, satır biçimlendirme işlemini başlatarak ve metin biçimlendirici 'nin çağrılmasıyla elde edilir FormatLine . Metin biçimlendiricisi, mağaza yöntemini çağırarak Metin deponuzdan metin çalıştırmalarını alır GetTextRun . TextRunNesneler daha sonra TextLine metin biçimlendirici tarafından nesneler halinde oluşturulur ve İnceleme veya görüntüleme için uygulamanıza verilir.
Metin biçimlendirici 'yi kullanma
TextFormatter WPF metin biçimlendirme altyapısıdır ve metin çizgilerini biçimlendirmek ve bölmek için hizmetler sağlar. Metin biçimlendiricisi farklı metin karakter biçimlerini ve paragraf stillerini işleyebilir ve uluslararası metin düzeni için destek içerir.
Geleneksel bir metin API 'sinin aksine, bir TextFormatter dizi geri arama yöntemi aracılığıyla metin düzeni istemcisiyle etkileşime girer. İstemcinin bu yöntemleri sınıfının bir uygulamasında sağlamasını gerektirir TextSource . Aşağıdaki diyagramda, istemci uygulaması ve arasındaki metin düzeni etkileşimi gösterilmektedir TextFormatter .

Metin biçimlendiricisi, uygulamasının bir uygulamasına ait metin deposundan biçimli metin satırları almak için kullanılır TextSource . Bu, ilk olarak yöntemi kullanılarak metin biçimlendirici bir örneği oluşturularak yapılır Create . Bu yöntem, metin biçimlendiricisi örneğini oluşturur ve maksimum çizgi yüksekliği ve genişlik değerlerini ayarlar. Metin biçimlendiricisi 'nin bir örneği oluşturulduktan hemen sonra, hat oluşturma işlemi yöntemi çağırarak başlatılır FormatLine . TextFormatter metin kaynağına geri çağrı yapar ve bir satırı oluşturan metin çalıştırmaları için metin ve biçimlendirme parametrelerini alır.
Aşağıdaki örnekte, bir metin deposunu biçimlendirme işlemi gösterilmektedir. TextFormatterNesnesi metin deposundan metin satırları almak ve sonra çizim için metin satırını biçimlendirmek için kullanılır DrawingContext .
// 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
Istemci metin deposunu uygulama
Metin biçimlendirme altyapısını genişlettiğinizde, 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 özelliklerinin, paragraf özelliklerinin, katıştırılmış nesnelerin ve diğer benzer içeriklerin izlenmesinden sorumludur. Ayrıca metin biçimlendirici TextRun tarafından nesne oluşturmak için kullanılan tek tek nesneleriyle metin biçimlendirici de sağlar TextLine .
Metin deposunun sanallaştırılmasını işlemek için metin deposunun öğesinden türetilmesi gerekir TextSource . TextSource metin deposundaki metin çalıştırmalarını almak için metin biçimlendirici tarafından kullanılan yöntemi tanımlar. GetTextRun , satır biçimlendirmesinde kullanılan metin çalıştırmalarını almak için metin biçimlendirici tarafından kullanılan yöntemdir. Çağrısı, GetTextRun aşağıdaki koşullardan biri gerçekleşene kadar metin biçimlendiricisi tarafından tekrar tekrar yapılır:
Bir TextEndOfLine veya alt sınıf döndürülür.
Metnin birikmiş genişliği, metin biçimlendirici veya metin biçimlendirici yöntemine yapılan çağrıyı oluşturmak için yapılan çağrıda belirtilen en büyük çizgi genişliğini aşıyor FormatLine .
"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 çekirdeği, metin biçimlendiricisi ve metin deposu arasındaki etkileşimdir. Uygulamanız, TextSourceTextRun nesne ve metin çalıştırmalarının biçimlendirilecek özelliklerle metin biçimlendirici sağlar. Bu etkileşim, GetTextRun metin biçimlendiricisi tarafından çağrılan yöntemi tarafından işlenir.
Aşağıdaki tabloda önceden tanımlanmış bazı TextRun nesneler gösterilmektedir.
| TextRun türü | Kullanım |
|---|---|
| TextCharacters | Karakter karakterlerinin gösterimini metin biçimlendiricine geçirmek için kullanılan özel metin çalıştırması. |
| TextEmbeddedObject | Ölçüm, isabet testi ve çizim gibi metin içindeki bir düğme veya görüntü gibi tüm içerikleri sağlamak için kullanılan özel metin çalıştırması. |
| TextEndOfLine | Bir satırın sonunu işaretlemek için kullanılan özel metin çalıştırması. |
| TextEndOfParagraph | Bir paragrafın sonunu işaretlemek için kullanılan özel metin çalıştırması. |
| TextEndOfSegment | Bir segmentin sonunu işaretlemek için kullanılan özel metin çalıştırması (örneğin, önceki bir çalıştırmanın etkilediği kapsamı bitirmek için) TextModifier . |
| TextHidden | Gizli bir karakter aralığını işaretlemek için kullanılan özelleştirilmiş metin. |
| TextModifier | Metin içinde metinlerin özelliklerini değiştirmek için kullanılan özelleştirilmiş metin çalıştırması. Kapsam bir sonraki eşleşen TextEndOfSegment metin çalıştırmasına veya bir sonraki öğesine genişletilir TextEndOfParagraph . |
Önceden tanımlanmış nesnelerden herhangi biri alt TextRun sınıflı olabilir. Bu, metin kaynağınızın özel verileri içeren metin çalıştırmaları ile metin biçimlendirici sağlamasına izin verir.
Aşağıdaki örnekte bir yöntemi gösterilmektedir GetTextRun . Bu metin deposu TextRun işleme için nesneleri metin biçimlendirici öğesine döndürür.
// 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
Not
Bu örnekte, metin deposu metnin tümüne aynı metin özelliklerini sağlar. Gelişmiş metin mağazaların tek tek karakterlerin farklı özelliklere sahip olmasını sağlamak için kendi yayma yönetimini uygulaması gerekir.
Biçimlendirme özelliklerini belirtme
TextRun nesneler, metin deposunun sunduğu özellikler kullanılarak biçimlendirilir. Bu özellikler iki tür olarak gelir TextParagraphProperties ve TextRunProperties . TextParagraphProperties ve gibi paragraf kapsamlı özellikleri işleyin TextAlignmentFlowDirection . TextRunProperties , ön plan Fırçası, Typeface ve yazı tipi boyutu gibi bir paragraf içinde çalıştırılan her metin için farklı olabilecek özelliklerdir. Özel paragraf ve özel metin çalışma özelliği türlerini uygulamak için uygulamanızın, ve sırasıyla türetilen sınıflar oluşturması gerekir TextParagraphPropertiesTextRunProperties .