Rysowanie sformatowanego tekstu
Ten temat zawiera omówienie funkcji obiektu FormattedText. Ten obiekt zapewnia kontrolę niskiego poziomu na potrzeby rysowania tekstu w aplikacjach Windows Presentation Foundation (WPF).
Omówienie technologii
Obiekt FormattedText umożliwia rysowanie tekstu wielowierszowego, gdzie każdy znak może być indywidualnie sformatowany. W poniższym przykładzie pokazano tekst zawierający kilka zastosowanych formatów.
Notatka
W przypadku tych deweloperów migrujących z interfejsu API Win32, tabela w sekcji migracji Win32 zawiera flagi DrawText Win32 i ich przybliżony odpowiednik w Windows Presentation Foundation (WPF).
Powody używania sformatowanego tekstu
WPF zawiera wiele kontrolek do rysowania tekstu na ekranie. Każda kontrolka jest przeznaczona dla innego scenariusza i ma własną listę funkcji i ograniczeń. Ogólnie rzecz biorąc, element TextBlock powinien być używany, gdy wymagana jest ograniczona obsługa tekstu, na przykład krótkie zdanie w interfejsie użytkownika. Label można użyć, gdy wymagana jest minimalna obsługa tekstu. Aby uzyskać więcej informacji, zobacz Documents in WPF.
Obiekt FormattedText zapewnia większe funkcje formatowania tekstu niż kontrolki tekstu programu Windows Presentation Foundation (WPF) i mogą być przydatne w przypadkach, gdy chcesz użyć tekstu jako elementu dekoracyjnego. Aby uzyskać więcej informacji, zobacz następującą sekcję Konwertowanie sformatowanego tekstu na geometrię.
Ponadto obiekt FormattedText jest przydatny do tworzenia obiektów pochodnych DrawingVisualzorientowanych na tekst. DrawingVisual to uproszczona klasa rysunku używana do renderowania kształtów, obrazów lub tekstu. Aby uzyskać więcej informacji, zobacz Hit Test using DrawingVisuals Sample.
Używanie obiektu FormattedText
Aby utworzyć sformatowany tekst, wywołaj konstruktor FormattedText, aby utworzyć obiekt FormattedText. Po utworzeniu początkowego sformatowanego ciągu tekstowego można zastosować zakres stylów formatowania.
Użyj właściwości MaxTextWidth, aby ograniczyć tekst do określonej szerokości. Tekst zostanie automatycznie zawijany, aby uniknąć przekroczenia określonej szerokości. Użyj właściwości MaxTextHeight, aby ograniczyć tekst do określonej wysokości. Zostanie wyświetlony wielokropek „...”, jeśli tekst przekroczy określoną wysokość.
Można zastosować wiele stylów formatowania do jednego lub więcej znaków. Można na przykład wywołać metody SetFontSize i SetForegroundBrush, aby zmienić formatowanie pierwszych pięciu znaków w tekście.
Poniższy przykład kodu tworzy obiekt FormattedText, a następnie stosuje kilka stylów formatowania do tekstu.
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
Jednostka miary rozmiaru czcionki
Podobnie jak w przypadku innych obiektów tekstowych w aplikacjach Windows Presentation Foundation (WPF), obiekt FormattedText używa niezależnych od urządzenia pikseli jako jednostki miary. Jednak większość aplikacji Win32 używa punktów jako jednostki miary. Jeśli chcesz użyć tekstu wyświetlanego w jednostkach punktów w aplikacjach Windows Presentation Foundation (WPF), musisz przekonwertować jednostki niezależne od urządzenia (1/96 cala na jednostkę) na punkty. Poniższy przykład kodu pokazuje, jak wykonać tę konwersję.
// The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);
' The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5)
Konwertowanie sformatowanego tekstu na geometrię
Możesz przekonwertować sformatowany tekst na obiekty Geometry, co pozwala na tworzenie innych typów wizualnie interesującego tekstu. Na przykład, można utworzyć obiekt Geometry na podstawie zarysu ciągu tekstowego.
W poniższych przykładach przedstawiono kilka sposobów tworzenia interesujących efektów wizualnych przez zmodyfikowanie pociągnięcia, wypełnienia i wyróżnienia przekonwertowanego tekstu.
Gdy tekst jest konwertowany na obiekt Geometry, nie jest to już kolekcja znaków — nie można modyfikować znaków w ciągu tekstowym. Można jednak wpłynąć na wygląd przekonwertowanego tekstu, modyfikując jego właściwości obrysu i wypełnienia. Obrys odnosi się do konturu przekonwertowanego tekstu; wypełnienie odnosi się do obszaru wewnątrz konturu przekonwertowanego tekstu. Aby uzyskać więcej informacji, zobacz Create Outlined Text.
Możesz również przekonwertować sformatowany tekst na obiekt PathGeometry i użyć obiektu do wyróżniania tekstu. Można na przykład zastosować animację do obiektu PathGeometry, tak aby animacja podążała za konturem sformatowanego tekstu.
W poniższym przykładzie pokazano sformatowany tekst, który został przekonwertowany na obiekt PathGeometry. Animowany wielokropek podąża ścieżką pociągnięć renderowanego tekstu.
Sfera podążająca za geometrią ścieżki tekstu
Aby uzyskać więcej informacji, zobacz Jak: Utworzyć animację PathGeometry dla tekstu.
Można utworzyć inne interesujące zastosowania dla sformatowanego tekstu po przekonwertowaniu go na obiekt PathGeometry. Możesz na przykład wyświetlić w nim klip wideo.
Migracja win32
Funkcje FormattedText do rysowania tekstu są podobne do funkcji Funkcji Win32 DrawText. W przypadku tych deweloperów migrujących z interfejsu API Win32 poniższa tabela zawiera listę flag Win32 DrawText i przybliżony odpowiednik w programie Windows Presentation Foundation (WPF).
Flaga funkcji DrawText | Odpowiednik WPF | Notatki |
---|---|---|
DT_BOTTOM | Height | Użyj właściwości Height, aby obliczyć odpowiednią pozycję Win32 DrawText "y". |
DT_CALCRECT | Height, Width | Użyj właściwości Height i Width, aby obliczyć prostokąt wyjściowy. |
DT_CENTER | TextAlignment | Użyj właściwości TextAlignment z wartością ustawioną na Center. |
DT_EDITCONTROL | Żaden | Nie jest to wymagane. Szerokość miejsca i renderowanie ostatniego wiersza są takie same jak w kontrolce edycji struktury. |
DT_END_ELLIPSIS | Trimming | Użyj właściwości Trimming z wartością CharacterEllipsis. Użyj WordEllipsis, aby uzyskać Win32 DT_END_ELLIPSIS z końcowym wielokropkiem DT_WORD_ELLIPSIS — w tym przypadku wielokropek pojawia się tylko na końcu słów, które nie mieszczą się w jednym wierszu. |
DT_EXPAND_TABS | Żaden | Nie jest to wymagane. Karty są automatycznie rozszerzane do przystanków co 4 ems, co odpowiada szerokości około 8 znaków niezależnych od języka. |
DT_EXTERNALLEADING | Żaden | Nie jest to wymagane. Zewnętrzne wiodące są zawsze uwzględniane w odstępach między wierszami. Użyj właściwości LineHeight, aby utworzyć odstępy między wierszami zdefiniowanymi przez użytkownika. |
DT_HIDEPREFIX | Żaden | Nie obsługiwane. Przed utworzeniem obiektu FormattedText usuń&z ciągu . |
DT_LEFT | TextAlignment | Jest to domyślne wyrównanie tekstu. Użyj właściwości TextAlignment z wartością ustawioną na Left. (Tylko WPF) |
DT_MODIFYSTRING | Żaden | Nieobsługiwane. |
DT_NOCLIP | VisualClip | Przycinanie nie odbywa się automatycznie. Jeśli chcesz wyciąć tekst, użyj właściwości VisualClip. |
DT_NOFULLWIDTHCHARBREAK | Żaden | Nieobsługiwane. |
DT_NOPREFIX | Żaden | Nie jest to wymagane. Znak "&" w ciągach jest zawsze traktowany jako normalny znak. |
DT_PATHELLIPSIS | Żaden | Użyj właściwości Trimming z wartością WordEllipsis. |
DT_PREFIX | Żaden | Nie obsługiwane. Jeśli chcesz użyć podkreśleń dla tekstu, takiego jak klucz akceleratora lub link, użyj metody SetTextDecorations. |
DT_PREFIXONLY | Żaden | Nieobsługiwane. |
DT_RIGHT | TextAlignment | Użyj właściwości TextAlignment z wartością ustawioną na Right. (Tylko WPF) |
DT_RTLREADING | FlowDirection | Ustaw właściwość FlowDirection na wartość RightToLeft. |
DT_SINGLELINE | Żaden | Nie jest to wymagane. FormattedText obiekty zachowują się jako kontrolka pojedynczego wiersza, chyba że właściwość MaxTextWidth jest ustawiona lub tekst zawiera karetki powrotu/wiersza (CR/LF). |
DT_TABSTOP | Żaden | Brak obsługi pozycji zatrzymania tabulatorów zdefiniowanych przez użytkownika. |
DT_TOP | Height | Nie jest to wymagane. Najważniejsze uzasadnienie jest wartością domyślną. Inne wartości pionowego pozycjonowania można zdefiniować, korzystając z właściwości Height do obliczenia odpowiedniej pozycji 'y' dla Win32 DrawText. |
DT_VCENTER | Height | Użyj właściwości Height, aby obliczyć odpowiednie położenie 'y' dla funkcji Win32 DrawText. |
DT_WORDBREAK | Żaden | Nie jest to wymagane. Dzielenie wyrazów odbywa się automatycznie z obiektami FormattedText. Nie można go wyłączyć. |
DT_WORD_ELLIPSIS | Trimming | Użyj właściwości Trimming z wartością WordEllipsis. |
Zobacz też
- FormattedText
- dokumenty w WPF
- Typografia w WPF
- Utwórz tekst konturowy
- Jak stworzyć animację PathGeometry dla tekstu
.NET Desktop feedback