Freigeben über


Zeichnen von formatiertem Text

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

Dieses Thema enthält folgende Abschnitte.

  • Übersicht über die Technologie
  • Verwenden des FormattedText-Objekts
  • Win32-Migration
  • Verwandte Abschnitte

Übersicht über die Technologie

Das FormattedText-Objekt ermöglicht das Zeichnen von mehrzeiligem Text, in dem jedes Zeichen einzeln formatiert werden kann. Im folgenden Beispiel wird Text veranschaulicht, auf den mehrere Formate angewendet wurden.

Angezeigter Text mit FormattedText-Methode

Mit dem FormattedText-Objekt angezeigter Text

HinweisHinweis

Für Entwickler, die von der Win32-API migrieren, enthält die Tabelle im Abschnitt Win32-Migration eine Auflistung der Win32-DrawText-Flags und die jeweilige Entsprechung in Windows Presentation Foundation (WPF).

Gründe für das Verwenden von formatiertem Text

WPF enthält mehrere Steuerelemente, um Text auf dem Bildschirm zeichnen zu können. Jedes Steuerelement richtet sich an ein anderes Szenario und verfügt über seine individuellen Features und Einschränkungen. Im Allgemeinen sollte das TextBlock-Element verwendet werden, wenn eine eingeschränkte Textunterstützung erforderlich ist, z. B. ein kurzer Satz in einer user interface (UI). Label kann verwendet werden, wenn nur ein Minimum an Textunterstützung erforderlich ist. Weitere Informationen finden Sie unter Dokumente in WPF.

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

Zusätzlich ist das FormattedText-Objekt hilfreich beim Erstellen textorientierter, vom DrawingVisual-Element abgeleiteter Objekte. DrawingVisual ist eine Lightweight-Zeichnungsklasse zum Rendern von Formen, Bildern oder Text. Weitere Informationen finden Sie unter Beispiel für Treffertests mit "DrawingVisuals".

Verwenden des FormattedText-Objekts

Wenn Sie formatierten Text erstellen möchten, rufen Sie den FormattedText-Konstruktor auf, um ein FormattedText-Objekt zu erstellen. Nachdem Sie die formatierte Anfangs-Textzeichenfolge erstellt haben, können Sie eine Reihe von Formatierungsstilen anwenden.

Verwenden Sie die MaxTextWidth-Eigenschaft, um den Text auf eine bestimmte Breite zu begrenzen. Der Text wird automatisch umgebrochen, damit vermieden wird, dass er die angegebene Breite überschreitet. Verwenden Sie die MaxTextHeight-Eigenschaft, um den Text auf eine bestimmte Höhe zu begrenzen. Der Text zeigt Auslassungspunkte (...) für den Text an, der die angegebene Höhe überschreitet.

Angezeigter Text mit Zeilenumbruch und Auslassungspunkten

Mit dem FormattedText-Objekt angezeigter Text

Sie können mehrere Formatierungsstile auf ein oder mehrere Zeichen anwenden. Sie könnten z. B. sowohl die SetFontSize-Methode als auch die SetForegroundBrush-Methode aufrufen, um die Formatierung der ersten fünf Zeichen im Text zu ändern.

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

        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
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));
}

Schriftgradmaßeinheit

Wie andere Textobjekte in Windows Presentation Foundation (WPF)-Anwendungen muss auch das FormattedText-Objekt geräteunabhängige Pixel als Maßeinheit verwenden. Die meisten Win32-Anwendungen verwenden jedoch Punkte als Maßeinheit. Wenn Sie Anzeigetext in Windows Presentation Foundation (WPF)-Anwendungen in Punkteinheiten verwenden möchten, müssen Sie device-independent units (1/96th inch per unit) in Punkte konvertieren. Im folgenden Codebeispiel wird gezeigt, wie diese Konvertierung ausgeführt wird.

            ' 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

Formatierter Text kann in Geometry-Objekte umgewandelt werden, sodass Sie andere visuell interessante Textarten erstellen können. Sie können beispielsweise auf Grundlage der Gliederung einer Textzeichenfolge ein Geometry-Objekt erstellen.

Textgliederung mit einem Pinsel für linearen Farbverlauf

Textkontur mit einem linearen Farbverlaufspinsel

Im folgenden Beispiel werden mehrere Möglichkeiten zum Erstellen interessanter visueller Effekte durch Ändern von Strichen, Füllung und Hervorhebung des konvertierten Texts veranschaulicht.

Beispiel für das Festlegen von verschiedenen Farben für Striche und Füllung

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

Beispiel für die Anwendung eines Bildpinsels auf den Strich

Text mit auf Strich angewendeten Bildpinsel

Beispiel für die Anwendung eines Bildpinsels auf den Strich und die Hervorhebung

Text mit auf Strich angewendeten Bildpinsel

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 Zeichenfolge nicht mehr ändern. Sie können jedoch die Darstellung des konvertierten Texts beeinflussen, indem Sie dessen Stricheigenschaften und Fülleigenschaften ändern. Der Strich bezieht sich auf die Kontur des konvertierten Texts und die Füllung auf den Bereich innerhalb der Kontur des konvertierten Texts. Weitere Informationen finden Sie unter Gewusst wie: 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 z. B. eine Animation auf das PathGeometry-Objekt anwenden, sodass die Animation der Kontur des formatierten Texts folgt.

Im folgenden Beispiel wird formatierter Text angezeigt, der in ein PathGeometry-Objekt konvertiert wurde. Eine animierte Ellipse folgt den Strichen des gerenderten Texts.

Sphäre, die der Pfadgeometrie des Texts folgt

Kugel, die der Pfadgeometrie des Textes folgt

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

Sie können weitere interessante Verwendungsmöglichkeiten für formatierten Text erstellen, sobald dieser in ein PathGeometry-Objekt konvertiert wurde. So kann er z. B. für die Anzeige von Videos verwendet werden.

Video, das in der Pfadgeometrie des Texts angezeigt wird

Video, das in der Pfadgeometrie von Text angezeigt wird

Win32-Migration

Die Features von FormattedText für das Zeichnen von Text ähneln den Features der Win32-DrawText-Funktion. Für Entwickler, die von der Win32-API migrieren, enthält die folgende Tabelle eine Auflistung der Win32-DrawText-Flags und die jeweilige Entsprechung in Windows Presentation Foundation (WPF).

DrawText-Flag

WPF-Entsprechung

Hinweise

DT_BOTTOM

Height

Verwenden Sie die Height-Eigenschaft, um eine entsprechende Win32-DrawText-'y'-Position zu berechnen.

DT_CALCRECT

Height, Width

Verwenden Sie die Height-Eigenschaft und die Width-Eigenschaft, um das Ausgaberechteck zu berechnen.

DT_CENTER

TextAlignment

Verwenden Sie die TextAlignment-Eigenschaft, wobei der Wert auf Center festgelegt ist.

DT_EDITCONTROL

Keine

Nicht erforderlich. Leerzeichenbreite und letztes Linienrendering entsprechen denen im Framework-Bearbeitungssteuerelement.

DT_END_ELLIPSIS

Trimming

Verwenden Sie die Trimming-Eigenschaft, wobei der Wert auf CharacterEllipsis festgelegt ist.

Verwenden Sie WordEllipsis, um Win32 DT_END_ELLIPSIS mit DT_WORD_ELIPSIS-Endellipse zu erhalten. In diesem Fall tritt die Zeichenellipse nur auf Wörtern auf, die nicht in eine Zeile passen.

DT_EXPAND_TABS

Keine

Nicht erforderlich. Registerkarten werden automatisch erweitert, sodass sie alle 4 em einen Haltepunkt aufweisen. Dies entspricht in etwa der Breite 8 sprachunabhängiger Zeichen.

DT_EXTERNALLEADING

Keine

Nicht erforderlich. Der externe Abstand ist immer im Zeilenabstand enthalten. Verwenden Sie die LineHeight-Eigenschaft, um einen benutzerdefinierten Zeilenabstand 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 Standardtextausrichtung. Verwenden Sie die TextAlignment-Eigenschaft mit dem Wert Left. (nur WPF).

DT_MODIFYSTRING

Keine

Wird nicht unterstützt.

DT_NOCLIP

VisualClip

Clipping geschieht nicht automatisch. Wenn Sie Text zurechtschneiden möchten, verwenden Sie die VisualClip-Eigenschaft.

DT_NOFULLWIDTHCHARBREAK

Keine

Wird nicht unterstützt.

DT_NOPREFIX

Keine

Nicht erforderlich. Das &-Zeichen in Zeichenfolgen wird immer als normales Zeichen behandelt.

DT_PATHELLIPSIS

Keine

Verwenden Sie die Trimming-Eigenschaft, wobei der Wert auf WordEllipsis festgelegt ist.

DT_PREFIX

Keine

Wird nicht unterstützt. Wenn Sie Unterstriche für Text verwenden möchten, beispielsweise eine Tastenkombination oder einen Link, verwenden Sie die SetTextDecorations-Methode.

DT_PREFIXONLY

Keine

Wird nicht unterstützt.

DT_RIGHT

TextAlignment

Verwenden Sie die TextAlignment-Eigenschaft mit dem Wert Right. (Nur WPF)

DT_RTLREADING

FlowDirection

Legen Sie die FlowDirection-Eigenschaft auf RightToLeft fest.

DT_SINGLELINE

Keine

Nicht erforderlich. FormattedText-Objekte verhalten sich wie einzeilige Steuerelemente, es sei denn, die MaxTextWidth-Eigenschaft ist aktiviert oder der Text enthält einen Wagenrücklauf/Zeilenvorschub (CR/LF).

DT_TABSTOP

Keine

Keine Unterstützung für benutzerdefinierte Tabstopppositionen.

DT_TOP

Height

Nicht erforderlich. Obere Ausrichtung ist der Standard. Andere vertikale Positionierungswerte können definiert werden, indem die Height-Eigenschaft zur Berechnung einer entsprechenden Win32-DrawText-'y'-Position verwendet wird.

DT_VCENTER

Height

Verwenden Sie die Height-Eigenschaft, um eine entsprechende Win32-DrawText-'y'-Position zu berechnen.

DT_WORDBREAK

Keine

Nicht erforderlich. Die Worttrennung geschieht bei FormattedText-Objekten automatisch. Sie können sie nicht deaktivieren.

DT_WORD_ELLIPSIS

Trimming

Verwenden Sie die Trimming-Eigenschaft, wobei der Wert auf WordEllipsis festgelegt ist.

Siehe auch

Aufgaben

Gewusst wie: Erstellen von Text mit Kontur

Referenz

FormattedText

Konzepte

Dokumente in WPF

Typografie in WPF

Gewusst wie: Erstellen einer PathGeometry-Animation für Text