Udostępnij za pośrednictwem


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.

Text displayed using FormattedText object

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ść.

Text displayed with wordwrap and ellipsis.

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.

Text outline using a linear gradient brush

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.

Text with different colors for fill and stroke

Text with image brush applied to stroke

Text with image brush applied to stroke and highlight

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.

Sphere following the path geometry of text
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.

Video displaying in the path geometry of text

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ż