Rysowanie formatowanego tekstu
Ten temat zawiera omówienie funkcji FormattedText obiektu. 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, w którym każdy znak w tekście może być sformatowany indywidualnie. W poniższym przykładzie pokazano tekst zawierający kilka zastosowanych formatów.
Uwaga
W przypadku tych deweloperów migrujących z interfejsu API Win32 tabela w sekcji Migracja win32 zawiera flagi Win32 DrawText i przybliżony odpowiednik w programie 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 powinien być używany, TextBlock 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 Dokumenty w WPF.
Obiekt FormattedText zapewnia większe funkcje formatowania tekstu niż kontrolki tekstu programu Windows Presentation Foundation (WPF) i może 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 FormattedText obiekt jest przydatny do tworzenia obiektów pochodnych zorientowanych na DrawingVisualtekst. DrawingVisual jest lekką klasą rysunku używaną do renderowania kształtów, obrazów lub tekstu. Aby uzyskać więcej informacji, zobacz Hit Test using DrawingVisuals Sample (Test trafienia przy użyciu przykładu DrawingVisuals).
Używanie obiektu FormattedText
Aby utworzyć sformatowany tekst, wywołaj konstruktor, FormattedText aby utworzyć FormattedText obiekt. Po utworzeniu początkowego sformatowanego ciągu tekstowego można zastosować zakres stylów formatowania.
MaxTextWidth Użyj właściwości , aby ograniczyć tekst do określonej szerokości. Tekst zostanie automatycznie zawijany, aby uniknąć przekroczenia określonej szerokości. MaxTextHeight Użyj właściwości , aby ograniczyć tekst do określonej wysokości. Tekst wyświetli wielokropek" "..." dla tekstu, który przekracza określoną wysokość.
Można zastosować wiele stylów formatowania do co najmniej jednego znaku. Można na przykład wywołać metody i SetForegroundBrush , SetFontSize aby zmienić formatowanie pierwszych pięciu znaków w tekście.
Poniższy przykład kodu tworzy FormattedText obiekt, 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 rozmiaru czcionki miary
Podobnie jak w przypadku innych obiektów tekstowych w aplikacjach Windows Presentation Foundation (WPF), FormattedText obiekt 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 Geometry obiekty, umożliwiając tworzenie innych typów wizualnie interesującego tekstu. Można na przykład utworzyć Geometry obiekt na podstawie konspektu 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 Geometry obiekt, 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 pociągnięcie i właściwości wypełnienia. Pociągnięcie odnosi się do konturu przekonwertowanego tekstu; wypełnienie odwołuje się do obszaru wewnątrz konspektu przekonwertowanego tekstu. Aby uzyskać więcej informacji, zobacz Create Outlined Text (Tworzenie tekstu konturowego).
Możesz również przekonwertować sformatowany tekst na PathGeometry obiekt i użyć obiektu do wyróżniania tekstu. Można na przykład zastosować animację do PathGeometry obiektu, tak aby animacja podążała za konturem sformatowanego tekstu.
W poniższym przykładzie pokazano sformatowany tekst, który został przekonwertowany na PathGeometry obiekt. Animowany wielokropek podąża ścieżką pociągnięć renderowanego tekstu.
Sfera po geometrii ścieżki tekstu
Aby uzyskać więcej informacji, zobacz How to: Create a PathGeometry Animation for Text (Instrukcje: tworzenie animacji PathGeometry dla tekstu).
Można utworzyć inne interesujące zastosowania dla sformatowanego tekstu po przekonwertowaniu go na PathGeometry obiekt. Możesz na przykład wyświetlić w nim klip wideo.
Migracja win32
Funkcje tekstu rysunkowego FormattedText 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 DrawText | Odpowiednik WPF | Uwagi |
---|---|---|
DT_BOTTOM | Height | Height Użyj właściwości , aby obliczyć odpowiednią pozycję Win32 DrawText "y". |
DT_CALCRECT | Height, Width | Height Użyj właściwości iWidth, aby obliczyć prostokąt wyjściowy. |
DT_CENTER | TextAlignment | TextAlignment Użyj właściwości z wartością ustawioną na Center. |
DT_EDITCONTROL | Brak | Niewymagane. Szerokość miejsca i renderowanie ostatniego wiersza są takie same jak w kontrolce edycji struktury. |
DT_END_ELLIPSIS | Trimming | Trimming Użyj właściwości z wartością CharacterEllipsis. Użyj WordEllipsis polecenia , aby uzyskać DT_END_ELLIPSIS Win32 z wielokropkiem końcowym DT_WORD_ELIPSIS — w tym przypadku wielokropek znaków występuje tylko w wyrazach, które nie mieszczą się w jednym wierszu. |
DT_EXPAND_TABS | Brak | Niewymagane. Karty są automatycznie rozszerzane w celu zatrzymania co 4 ems, co jest w przybliżeniu szerokości 8 znaków niezależnych od języka. |
DT_EXTERNALLEADING | Brak | Niewymagane. 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 | Brak | Nieobsługiwane. Usuń znak "&" z ciągu przed utworzeniem FormattedText obiektu. |
DT_LEFT | TextAlignment | Jest to domyślne wyrównanie tekstu. TextAlignment Użyj właściwości z wartością ustawioną na Left. (Tylko WPF) |
DT_MODIFYSTRING | Brak | Nieobsługiwane. |
DT_NOCLIP | VisualClip | Wycinki nie są wykonywane automatycznie. Jeśli chcesz wyciąć tekst, użyj VisualClip właściwości . |
DT_NOFULLWIDTHCHARBREAK | Brak | Nieobsługiwane. |
DT_NOPREFIX | Brak | Niewymagane. Znak "&" w ciągach jest zawsze traktowany jako normalny znak. |
DT_PATHELLIPSIS | Brak | Trimming Użyj właściwości z wartością WordEllipsis. |
DT_PREFIX | Brak | Nieobsługiwane. Jeśli chcesz użyć podkreśleń dla tekstu, takiego jak klucz akceleratora lub link, użyj SetTextDecorations metody . |
DT_PREFIXONLY | Brak | Nieobsługiwane. |
DT_RIGHT | TextAlignment | TextAlignment Użyj właściwości z wartością ustawioną na Right. (Tylko WPF) |
DT_RTLREADING | FlowDirection | Ustaw właściwość FlowDirection na RightToLeft. |
DT_SINGLELINE | Brak | Niewymagane. FormattedText obiekty zachowują się jako kontrolka pojedynczego wiersza, chyba że MaxTextWidth właściwość jest ustawiona lub tekst zawiera karetki powrotu/wiersza (CR/LF). |
DT_TABSTOP | Brak | Brak obsługi pozycji zatrzymania tabulatorów zdefiniowanych przez użytkownika. |
DT_TOP | Height | Niewymagane. Najważniejsze uzasadnienie jest wartością domyślną. Inne wartości pozycjonowania w pionie można zdefiniować za pomocą Height właściwości do obliczenia odpowiedniej pozycji Win32 DrawText "y". |
DT_VCENTER | Height | Height Użyj właściwości , aby obliczyć odpowiednią pozycję Win32 DrawText "y". |
DT_WORDBREAK | Brak | Niewymagane. Dzielenie wyrazów odbywa się automatycznie z obiektami FormattedText . Nie można go wyłączyć. |
DT_WORD_ELLIPSIS | Trimming | Trimming Użyj właściwości z wartością WordEllipsis. |
Zobacz też
.NET Desktop feedback