Zeichnen von formatiertem Text

Dieses Thema bietet eine Übersicht über die Features des FormattedText-Objekts. Dieses Objekt bietet eine einfache Steuerung zum Zeichnen von Text in WPF-Anwendungen (Windows Presentation Foundation).

Technologieübersicht

Das FormattedText-Objekt ermöglicht das Zeichnen von mehrzeiligem Text, in dem jedes Zeichen einzeln formatiert werden kann. Das folgende Beispiel zeigt Text mit mehreren angewendeten Formaten:

Text displayed using FormattedText object

Hinweis

Für Entwickler, die von der Win32-API umsteigen, listet die Tabelle im Abschnitt Win32-Migration die DrawText-Flags von Win32 und die ungefähre Entsprechung in Windows Presentation Foundation (WPF) auf.

Gründe für das Verwenden von formatiertem Text

WPF enthält zahlreiche Steuerelemente für das Zeichnen von Text auf dem Bildschirm. Jedes Steuerelement ist einem bestimmten Szenario zugeordnet und besitzt eine eigene Liste von Funktionen und Einschränkungen. Im Allgemeinen sollte das TextBlock-Element verwendet werden, wenn eine eingeschränkte Textunterstützung erforderlich ist, z. B. ein kurzer Satz auf einer Benutzeroberfläche. Label kann verwendet werden, wenn minimale Textunterstützung erforderlich ist. Weitere Informationen finden Sie unter Dokumente in WPF.

Das FormattedText-Objekt bietet umfassendere Textformatierungsfunktionen als WPF-Textsteuerelemente (Windows Presentation Foundation). Dieses Objekt kann hilfreich sein, wenn Text als dekoratives Element verwendet werden soll. Weitere Informationen finden Sie im folgenden Abschnitt Konvertieren von formatiertem Text in eine Geometrie.

Darüber hinaus ist das FormattedText-Objekt nützlich für die Erstellung textorientierter von DrawingVisual abgeleiteter Objekte. DrawingVisual ist eine einfache Zeichnungsklasse zum Rendern von Formen, Bildern oder Text. Weitere Informationen finden Sie unter Beispiel für Treffertests mit DrawingVisuals.

Verwenden des FormattedText-Objekts

Zum Erstellen von formatiertem Text rufen Sie den FormattedText-Konstruktor auf, um ein FormattedText-Objekt zu erstellen. Nachdem Sie die Anfangszeichenfolge für formatierten Text erstellt haben, können Sie eine Reihe von Formatvorlagen anwenden.

Verwenden Sie die MaxTextWidth-Eigenschaft, um den Text auf eine bestimmte Breite zu beschränken. Der Text wird automatisch umgebrochen, um die angegebene Breite nicht zu überschreiten. Verwenden Sie die MaxTextHeight-Eigenschaft, um den Text auf eine bestimmte Höhe zu beschränken. Der Text zeigt Auslassungspunkte „...“ an, wenn die angegebene Höhe überschritten wird.

Text displayed with wordwrap and ellipsis.

Sie können mehrere Formatvorlagen auf ein oder mehrere Zeichen anwenden. So können Sie beispielsweise zum Ändern der Formatierung der ersten fünf Zeichen im Text gleichzeitig die SetFontSize-Methode und die SetForegroundBrush-Methode aufrufen.

Der folgende Code veranschaulicht, wie ein FormattedText-Objekt erstellt wird und anschließend mehrere Formatstile auf den Text angewendet werden.

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

Maßeinheit für den Schriftgrad

Wie andere Textobjekte in WPF-Anwendungen (Windows Presentation Foundation) verwendet das FormattedText-Objekt geräteunabhängige Pixel als Maßeinheit. Die meisten Win32-Anwendungen verwenden jedoch Punkte als Maßeinheit. Wenn Sie in WPF-Anwendungen (Windows Presentation Foundation) Text in Punkteinheiten anzeigen möchten, müssen Sie geräteunabhängige Einheiten (1/96 Zoll pro Einheit) in Punkte konvertieren. Der folgende Code veranschaulicht diese Konvertierung:

// 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)

Konvertieren von formatiertem Text in eine Geometrie

Sie können formatierten Text in Geometry-Objekte konvertieren, mit denen Sie weitere Arten von visuell interessantem Text erstellen können. Sie können z. B. ein Geometry-Objekt auf Grundlage der Gliederung einer Textzeichenfolge erstellen.

Text outline using a linear gradient brush

Die folgenden Beispiele zeigen verschiedene Möglichkeiten zum Erstellen von visuell interessanten Effekten durch Ändern von Strich, Füllung und Hervorhebung des konvertierten Texts.

Text with different colors for fill and stroke

Text with image brush applied to stroke

Text with image brush applied to stroke and highlight

Wenn Text in ein Geometry-Objekt konvertiert wird, stellt er keine Auflistung von Zeichen mehr da, d. h. dass die Zeichen in der Textzeichenfolge nicht geändert werden können. Sie können jedoch die Darstellung des konvertierten Texts durch Ändern der Strich- und Füllungseigenschaften ändern. Der Strich bezieht sich auf die Kontur des konvertierten Texts und die Füllung auf den Bereich innerhalb der Kontur. Weitere Informationen finden Sie unter Erstellen von Text mit Kontur.

Sie können formatierten Text auch in ein PathGeometry-Objekt konvertieren und es zum Hervorheben des Texts verwenden. So können Sie beispielsweise auf ein PathGeometry-Objekt eine Animation anwenden, die der Kontur des formatierten Texts folgt.

Das folgende Beispiel zeigt formatierten Text, der in ein PathGeometry-Objekt konvertiert wurde. Eine animierte Ellipse folgt dem Strichpfad des gerenderten Texts.

Sphere following the path geometry of text
Kugel, die der Pfadgeometrie des Textes folgt

Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer PathGeometry-Animation für Text.

Sobald formatierter Text in ein PathGeometry-Objekt konvertiert wurde, können Sie weitere interessante Verwendungsmöglichkeiten dafür erstellen. So können Sie beispielsweise ein zugeschnittenes Video darin anzeigen.

Video displaying in the path geometry of text

Win32-Migration

Die Funktionen von FormattedText zum Zeichnen von Text ähneln den Features der DrawText-Funktion von Win32. Für die Entwickler, die von der Win32-API umsteigen, listet die folgende Tabelle die DrawText-Flags von Win32 und die ungefähre Entsprechung in Windows Presentation Foundation (WPF) auf.

DrawText-Flag WPF-Entsprechung Notizen
DT_BOTTOM Height Verwenden Sie die Height-Eigenschaft, um eine geeignete Y-Position für DrawText von Win32 zu berechnen.
DT_CALCRECT Height, Width Verwenden Sie die Eigenschaften Height und Width, um das Ausgaberechteck zu berechnen.
DT_CENTER TextAlignment Verwenden Sie die TextAlignment-Eigenschaft mit dem auf Center festgelegten Wert.
DT_EDITCONTROL Keine Nicht erforderlich. Rendern von Abstandsbreite und letzter Zeile sind identisch mit dem Edit-Steuerelement für Framework.
DT_END_ELLIPSIS Trimming Verwenden Sie die Trimming-Eigenschaft mit dem Wert CharacterEllipsis.

Verwenden Sie WordEllipsis, um DT_END_ELLIPSIS von Win32 mit der Endellipse DT_WORD_ELIPSIS zu erhalten. In diesem Fall erfolgt die Zeichenellipse nur bei Wörtern, die nicht in eine einzige Zeile passen.
DT_EXPAND_TABS Keine Nicht erforderlich. Registerkarten werden automatisch auf Zwischenstopps nach jeweils 4 em erweitert. Dies entspricht etwa der Breite von 8 sprachunabhängigen Zeichen.
DT_EXTERNALLEADING Keine Nicht erforderlich. Der externe Abstand ist immer im Zeilenabstand enthalten. Verwenden Sie die LineHeight-Eigenschaft, um benutzerdefinierte Zeilenabstände zu erstellen.
DT_HIDEPREFIX Keine Wird nicht unterstützt. Entfernen Sie vor dem Erstellen des FormattedText-Objekts das „&“-Zeichen aus der Zeichenfolge.
DT_LEFT TextAlignment Dies ist die standardmäßige Textausrichtung. Verwenden Sie die TextAlignment-Eigenschaft mit dem auf Left festgelegten Wert. (nur für WPF)
DT_MODIFYSTRING Keine Wird nicht unterstützt.
DT_NOCLIP VisualClip Clipping geschieht nicht automatisch. Wenn Sie Text beschneiden möchten, verwenden Sie die VisualClip-Eigenschaft.
DT_NOFULLWIDTHCHARBREAK Keine Wird nicht unterstützt.
DT_NOPREFIX Keine Nicht erforderlich. Das &-Zeichen innerhalb der Zeichenfolgen wird immer als normales Zeichen behandelt.
DT_PATHELLIPSIS Keine Verwenden Sie die Trimming-Eigenschaft mit dem Wert WordEllipsis.
DT_PREFIX Keine Wird nicht unterstützt. Verwenden Sie die SetTextDecorations-Methode für Unterstriche im Text, wie etwa bei Zugriffstasten oder Links.
DT_PREFIXONLY Keine Wird nicht unterstützt.
DT_RIGHT TextAlignment Verwenden Sie die TextAlignment-Eigenschaft mit dem auf Right festgelegten Wert. (nur für WPF)
DT_RTLREADING FlowDirection Setzen Sie die FlowDirection-Eigenschaft auf RightToLeft.
DT_SINGLELINE Keine Nicht erforderlich. FormattedText-Objekte verhalten sich wie Steuerelemente für einzelne Textzeilen, wenn nicht entweder die MaxTextWidth-Eigenschaft festgelegt wird oder der Text einen Wagenrücklauf/Zeilenvorschub (CR/LF) enthält.
DT_TABSTOP Keine Keine Unterstützung für benutzerdefinierte Tabstopppositionen.
DT_TOP Height Nicht erforderlich. Obere Ausrichtung ist die Standardeinstellung. Andere vertikale Positionierungswerte können durch Verwenden der Height-Eigenschaft zur Berechnung einer entsprechenden y-Position von DrawText in Win32 definiert werden.
DT_VCENTER Height Verwenden Sie die Height-Eigenschaft, um eine geeignete Y-Position für DrawText von Win32 zu berechnen.
DT_WORDBREAK Keine Nicht erforderlich. Die Wörtertrennung geschieht bei FormattedText-Objekten automatisch. Sie kann nicht deaktiviert werden.
DT_WORD_ELLIPSIS Trimming Verwenden Sie die Trimming-Eigenschaft mit dem Wert WordEllipsis.

Siehe auch