Freigeben über


Zeichnen von formatiertem Text

Dieses Thema enthält eine Übersicht über die Funktionen des FormattedText-Objekts. Dieses Objekt bietet eine niederstufige Steuerung für das Zeichnen von Text in Windows Presentation Foundation (WPF)-Anwendungen.

Technologieübersicht

Mit dem FormattedText-Objekt können Sie mehrzeiligen Text zeichnen, in dem jedes Zeichen im Text einzeln formatiert werden kann. Das folgende Beispiel zeigt Text, auf den mehrere Formate angewendet wurden.

Text, der mit dem FormattedText-Objekt angezeigt wird

Hinweis

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

Gründe für die Verwendung von formatiertem Text

WPF enthält mehrere Steuerelemente zum Zeichnen von Text auf dem Bildschirm. Jedes Steuerelement ist auf ein anderes Szenario ausgerichtet und verfügt über eine eigene Liste von Features und Einschränkungen. Im Allgemeinen sollte das TextBlock-Element verwendet werden, wenn eine eingeschränkte Textunterstützung erforderlich ist, z. B. einen kurzen Satz auf einer Benutzeroberfläche. Label kann verwendet werden, wenn eine minimale Textunterstützung erforderlich ist. Weitere Informationen finden Sie unter Dokumente in WPF.

Das FormattedText-Objekt bietet größere Textformatierungsfeatures als Windows Presentation Foundation (WPF)-Textsteuerelemente und kann in Fällen hilfreich sein, in denen Sie Text als dekoratives Element verwenden möchten. Weitere Informationen finden Sie im folgenden Abschnitt Konvertieren von formatiertem Text in eine Geometrie.

Darüber hinaus ist das FormattedText-Objekt nützlich, um textorientierte DrawingVisual-abgeleitete Objekte zu erstellen. DrawingVisual ist eine einfache Zeichnungsklasse, die zum Rendern von Formen, Bildern oder Text verwendet wird. Weitere Informationen finden Sie unter Beispiel für Treffertests mit „DrawingVisuals“.

Verwenden des FormattedText-Objekts

Rufen Sie zum Erstellen von formatiertem Text den FormattedText-Konstruktor auf, um ein FormattedText-Objekt zu erstellen. Nachdem Sie eine ursprünglich formatierte Textzeichenfolge erstellt haben, können Sie eine Reihe von Formatierungsstilen anwenden.

Verwenden Sie die eigenschaft MaxTextWidth, 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 eigenschaft MaxTextHeight, um den Text auf eine bestimmte Höhe zu beschränken. Der Text zeigt Auslassungspunkte (...) an, wenn die angegebene Höhe überschritten wird.

Text, der mit Zeilenumbruch und Auslassungspunkten angezeigt wird

Sie können mehrere Formatvorlagen auf ein oder mehrere Zeichen anwenden. Sie können z. B. die methoden SetFontSize und SetForegroundBrush aufrufen, um die Formatierung der ersten fünf Zeichen im Text zu ändern.

Im folgenden Codebeispiel wird ein FormattedText-Objekt erstellt und anschließend mehrere Formatvorlagen auf den Text angewendet.

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 bei anderen Textobjekten in Windows Presentation Foundation (WPF)-Anwendungen verwendet das FormattedText-Objekt geräteunabhängige Pixel als Maßeinheit. Die meisten Win32-Anwendungen verwenden jedoch Punkte als Maßeinheit. Wenn Sie Anzeigetext in Punkteinheiten in Windows Presentation Foundation (WPF)-Anwendungen verwenden möchten, müssen Sie geräteunabhängige Einheiten (1/96. Zoll pro Einheit) in Punkte umwandeln. Das folgende Codebeispiel zeigt, wie Sie diese Konvertierung ausführen.

// 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, sodass Sie andere Arten von visuell interessantem Text erstellen können. Sie können z. B. ein Geometry-Objekt basierend auf der Gliederung einer Textzeichenfolge erstellen.

Textkontur mit einem linearen Farbverlaufspinsel

Die folgenden Beispiele veranschaulichen verschiedene Möglichkeiten, interessante visuelle Effekte zu erzeugen, indem der Strich, die Füllung und die Hervorhebung vom konvertierten Text geändert werden.

Text mit unterschiedlichen Farben für Füllung und Strich

Text mit auf Strich angewendetem Bildpinsel

Text mit Bildpinsel, der auf den Strich angewendet wird, und Hervorhebung

Wenn Text in ein Geometry-Objekt konvertiert wird, handelt es sich nicht mehr um eine Auflistung von Zeichen. Sie können die Zeichen in der Textzeichenfolge nicht ändern. 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 auch formatierten Text in ein PathGeometry-Objekt konvertieren und das Objekt zum Hervorheben des Texts verwenden. Sie können beispielsweise eine Animation auf das PathGeometry-Objekt anwenden, sodass die Animation der Gliederung 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.

Kugel, die der Pfadgeometrie des Textes folgt
Kugel, die der Pfadgeometrie des Textes folgt

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

Sie können andere interessante Verwendungsmöglichkeiten für formatierten Text erstellen, nachdem sie in ein PathGeometry-Objekt konvertiert wurde. Sie können zum Beispiel Videomaterial zuschneiden, um es darin anzuzeigen.

Video, das in der Pfadgeometrie von Text angezeigt wird angezeigt wird

Win32-Migration

Die Features von FormattedText für Zeichnungstext ähneln den Features der Win32 DrawText-Funktion. Für Entwickler, die von der Win32-API migrieren, werden in der folgenden Tabelle die Win32 DrawText-Flags und die ungefähre Entsprechung in Windows Presentation Foundation (WPF) aufgeführt.

DrawText-Flag WPF-Entsprechung Hinweise
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 Nichts Nicht erforderlich. Das Rendern der Abstandsbreite und der letzten Zeile ist identisch mit dem edit-Steuerelement für das 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 Nichts Nicht erforderlich. Registerkarten werden automatisch auf Zwischenstopps nach jeweils 4 em erweitert. Dies entspricht etwa der Breite von 8 sprachunabhängigen Zeichen.
DT_EXTERNALLEADING Nichts Nicht erforderlich. Der externe Abstand ist immer im Zeilenabstand enthalten. Verwenden Sie die LineHeight-Eigenschaft, um einen benutzerdefinierten Zeilenabstand zu erstellen.
DT_HIDEPREFIX Nichts Nicht unterstützt. Entfernen Sie '&' aus der Zeichenfolge, bevor Sie das FormattedText-Objekt erstellen.
DT_LEFT TextAlignment Dies ist die Standardtextausrichtung. Verwenden Sie die TextAlignment-Eigenschaft mit dem auf Left festgelegten Wert. (nur WPF)
DT_MODIFYSTRING Nichts Nicht unterstützt.
DT_NOCLIP VisualClip Das Clipping erfolgt nicht automatisch. Wenn Sie Text ausschneiden möchten, verwenden Sie die eigenschaft VisualClip.
DT_NOFULLWIDTHCHARBREAK Nichts Nicht unterstützt.
DT_NOPREFIX Nichts Nicht erforderlich. Das Zeichen "&" in Zeichenfolgen wird immer als normales Zeichen behandelt.
DT_PATHELLIPSIS Nichts Verwenden Sie die Trimming-Eigenschaft mit dem Wert WordEllipsis.
DT_PREFIX Nichts Nicht unterstützt. Verwenden Sie die SetTextDecorations-Methode für Unterstriche im Text, wie etwa bei Zugriffstasten oder Links.
DT_PREFIXONLY Nichts Nicht unterstützt.
DT_RIGHT TextAlignment Verwenden Sie die TextAlignment-Eigenschaft mit dem auf Right festgelegten Wert. (nur WPF)
DT_RTLREADING FlowDirection Legen Sie die FlowDirection-Eigenschaft auf RightToLeft fest.
DT_SINGLELINE Nichts 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 (Carriage Return, CR) bzw. Zeilenvorschub (Line Feed, LF) enthält.
DT_TABSTOP Nichts Keine Unterstützung für benutzerdefinierte Tabstopppositionen.
DT_TOP Height Nicht erforderlich. Die obere Ausrichtung ist die Standardeinstellung. Andere vertikale Positionierungswerte können mithilfe der Height-Eigenschaft definiert werden, um eine entsprechende Win32 DrawText "y"-Position zu berechnen.
DT_VCENTER Height Verwenden Sie die Height-Eigenschaft, um eine geeignete Y-Position für DrawText von Win32 zu berechnen.
DT_WORDBREAK Nichts Nicht erforderlich. Die Wörtertrennung erfolgt bei FormattedText-Objekten automatisch. Sie können sie nicht deaktivieren.
DT_WORD_ELLIPSIS Trimming Verwenden Sie die Trimming-Eigenschaft mit dem Wert WordEllipsis.

Siehe auch