Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Windows Presentation Foundation (WPF) menyediakan sekumpulan API yang kuat untuk menyertakan teks dalam aplikasi Anda. API tata letak dan antarmuka pengguna (UI), seperti TextBlock, menyediakan elemen yang paling umum dan umum digunakan untuk presentasi teks. API gambar, seperti GlyphRunDrawing dan FormattedText, menyediakan sarana untuk menyertakan teks yang diformat dalam gambar. Pada tingkat yang paling canggih, WPF menyediakan mesin pemformatan teks yang dapat diperluas untuk mengontrol setiap aspek presentasi teks, seperti manajemen penyimpanan teks, manajemen pemformatan eksekusi teks, dan manajemen objek yang disematkan.
Topik ini menyediakan pengenalan pemformatan teks WPF. Ini berfokus pada implementasi klien dan penggunaan mesin pemformatan teks WPF.
Nota
Semua contoh kode dalam dokumen ini dapat ditemukan di Sampel Pemformatan Teks Tingkat Lanjut.
Prasyarat
Topik ini mengasumsikan bahwa Anda terbiasa dengan API tingkat yang lebih tinggi yang digunakan untuk presentasi teks. Sebagian besar skenario pengguna tidak akan memerlukan API pemformatan teks tingkat lanjut yang dibahas dalam topik ini. Untuk pengenalan API teks yang berbeda, lihat Dokumen di WPF.
Pemformatan Teks Tingkat Lanjut
Tata letak teks dan kontrol UI di WPF menyediakan properti pemformatan yang memungkinkan Anda dengan mudah menyertakan teks yang diformat dalam aplikasi Anda. Kontrol ini mengekspos sejumlah properti untuk menangani presentasi teks, yang mencakup typeface, ukuran, dan warnanya. Dalam keadaan biasa, kontrol ini dapat menangani sebagian besar presentasi teks dalam aplikasi Anda. Namun, beberapa skenario tingkat lanjut memerlukan kontrol penyimpanan teks serta presentasi teks. WPF menyediakan mesin pemformatan teks yang dapat diperluas untuk tujuan ini.
Fitur pemformatan teks tingkat lanjut yang ditemukan di WPF terdiri dari mesin pemformatan teks, penyimpanan teks, eksekusi teks, dan properti pemformatan. Mesin pemformatan teks, TextFormatter, membuat baris teks yang akan digunakan untuk presentasi. Ini dicapai dengan memulai proses pemformatan baris dan memanggil pemformat teks FormatLine. Pemformat teks mengambil segmen teks dari penyimpanan teks Anda dengan memanggil metode GetTextRun penyimpanan. Objek TextRun kemudian dibentuk menjadi TextLine objek oleh pemformat teks dan diberikan kepada aplikasi Anda untuk inspeksi atau tampilan.
Menggunakan Pemformat Teks
TextFormatter adalah mesin pemformatan teks WPF dan menyediakan layanan untuk memformat dan memecah baris teks. Pemformat teks dapat menangani format karakter teks dan gaya paragraf yang berbeda, dan menyertakan dukungan untuk tata letak teks internasional.
Tidak seperti API teks tradisional, TextFormatter berinteraksi dengan klien tata letak teks melalui serangkaian metode panggilan balik. Ini mengharuskan klien untuk menyediakan metode ini dalam implementasi TextSource kelas. Diagram berikut mengilustrasikan interaksi tata letak teks antara aplikasi klien dan TextFormatter.
Pemformat teks digunakan untuk mengambil baris teks yang diformat dari penyimpanan teks, yang merupakan implementasi dari TextSource. Ini dilakukan dengan terlebih dahulu membuat instans pemformat teks dengan menggunakan Create metode . Metode ini membuat instans pemformat teks dan mengatur tinggi garis maksimum dan nilai lebar. Segera setelah instans pemformat teks dibuat, proses pembuatan baris dimulai dengan memanggil FormatLine metode . TextFormatter mengakses sumber teks untuk mengambil parameter pemformatan teks dan potongan teks yang membentuk satu garis.
Dalam contoh berikut, proses pemformatan penyimpanan teks diperlihatkan. Objek TextFormatter digunakan untuk mengambil baris teks dari penyimpanan teks, lalu memformat baris teks untuk digambar ke dalam 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
Menerapkan Penyimpanan Teks untuk Klien
Saat memperluas mesin pemformatan teks, Anda diharuskan untuk mengimplementasikan dan mengelola semua aspek penyimpanan teks. Ini bukan tugas sepele. Penyimpanan teks bertanggung jawab untuk melacak properti eksekusi teks, properti paragraf, objek yang disematkan, dan konten serupa lainnya. Ini juga menyediakan pemformat teks dengan objek individual TextRun yang digunakan pemformat teks untuk membuat TextLine objek.
Untuk menangani virtualisasi penyimpanan teks, penyimpanan teks harus berasal dari TextSource. TextSource menentukan metode yang digunakan pemformat teks untuk mengambil potongan teks dari penyimpanan teks. GetTextRun adalah metode yang digunakan oleh pengolah teks untuk mengambil potongan teks yang digunakan dalam pemformatan baris. Panggilan ke GetTextRun berulang kali dilakukan oleh pemformat teks hingga salah satu kondisi berikut terjadi:
Sebuah TextEndOfLine atau subkelas dikembalikan.
Lebar akumulasi rentetan teks melebihi lebar garis maksimum yang ditentukan dalam panggilan untuk membuat pemformat teks atau dalam panggilan ke metode FormatLine pemformat teks.
Urutan baris baru Unicode, seperti "CF", "LF", atau "CRLF", dikembalikan.
Menyediakan Eksekusi Teks
Inti dari proses pemformatan teks adalah interaksi antara pemformat teks dan penyimpanan teks. Implementasi TextSource Anda menyediakan pemformat teks dengan objek TextRun dan properti yang digunakan untuk memformat penggalan teks. Interaksi ini ditangani oleh metode GetTextRun, yang dipanggil oleh pemformat teks.
Tabel berikut ini memperlihatkan beberapa objek yang telah TextRun ditentukan sebelumnya.
| Tipe TextRun | Penggunaan |
|---|---|
| TextCharacters | Rangkaian teks khusus yang digunakan untuk meneruskan representasi bentuk huruf karakter kembali ke pemformat teks. |
| TextEmbeddedObject | Bagian teks khusus yang digunakan untuk menyediakan konten di mana pengukuran, pengujian benturan, dan penggambaran dilakukan secara keseluruhan, seperti tombol atau gambar dalam teks. |
| TextEndOfLine | Teks khusus yang digunakan untuk menandai akhir dari sebuah baris. |
| TextEndOfParagraph | Teks khusus yang digunakan untuk menandai akhir paragraf. |
| TextEndOfSegment | Rentang teks khusus yang digunakan untuk menandai akhir segmen, seperti untuk mengakhiri ruang lingkup yang terpengaruh oleh rentang teks sebelumnya TextModifier. |
| TextHidden | Bagian teks khusus yang digunakan untuk menandai rentang karakter tersembunyi. |
| TextModifier | Eksekusi teks khusus yang digunakan untuk memodifikasi properti eksekusi teks dalam cakupannya. Cakupan meluas ke rentetan teks TextEndOfSegment yang cocok berikutnya, atau TextEndOfParagraph berikutnya. |
Salah satu objek yang telah TextRun ditentukan sebelumnya dapat disubkelas. Ini memungkinkan sumber teks Anda untuk menyediakan pemformat teks dengan eksekusi teks yang menyertakan data kustom.
Contoh berikut menunjukkan metode GetTextRun. Penyimpanan teks ini mengembalikan TextRun objek ke pemformat teks untuk diproses.
// 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
Nota
Dalam contoh ini, penyimpanan teks menyediakan properti teks yang sama untuk semua teks. Penyimpanan teks tingkat lanjut perlu menerapkan manajemen rentang mereka sendiri untuk memungkinkan karakter individual memiliki properti yang berbeda.
Menentukan Properti Pemformatan
TextRun objek diformat dengan menggunakan properti yang disediakan oleh penyimpanan teks. Properti ini tersedia dalam dua jenis, TextParagraphProperties dan TextRunProperties. TextParagraphProperties menangani properti inklusif paragraf seperti TextAlignment dan FlowDirection. TextRunProperties adalah properti yang bisa berbeda untuk setiap teks yang dijalankan dalam paragraf, seperti kuas latar depan, Typeface, dan ukuran font. Untuk menerapkan paragraf kustom dan jenis properti eksekusi teks kustom, aplikasi Anda harus membuat kelas yang berasal dari TextParagraphProperties dan TextRunProperties masing-masing.
Lihat juga
- Tipografi pada WPF
- Dokumen di WPF
.NET Desktop feedback