Gewusst wie: Erstellen von Text mit Kontur

In den meisten Fällen fügen Sie Textzeichenfolgen in der Windows Presentation Foundation (WPF)-Anwendung eine Verzierung hinzu, wenn Sie Text in Bezug auf eine Auflistung von diskreten Zeichen oder Glyphen hinzufügen. Sie können beispielsweise einen linearen Farbverlaufspinsel erstellen und auf die Foreground-Eigenschaft eines TextBox-Objekts anwenden. Wenn Sie das Textfeld anzeigen oder bearbeiten, wird der lineare Farbverlaufspinsel automatisch auf den aktuellen Satz von Zeichen in der Textzeichenfolge angewendet.

Text displayed with a linear gradient brush

Sie können jedoch auch Text in Geometry-Objekte konvertieren, sodass Sie andere Arten von visuell ansprechendem Rich-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

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.

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

Text with different colors for fill and stroke

Text with image brush applied to stroke

Das umgebende Rechteck oder die Hervorhebung des konvertierten Texts kann auch geändert werden. Im folgenden Beispiel wird eine Möglichkeit zum Erstellen visueller Effekte gezeigt, indem Sie den Strich und die Hervorhebung des konvertierten Texts ändern.

Text with image brush applied to stroke and highlight

Beispiel

Der Schlüssel zum Konvertieren von Text in ein Geometry-Objekt besteht darin, das FormattedText-Objekt zu verwenden. Nachdem Sie dieses Objekt erstellt haben, können Sie die Methoden BuildGeometry und BuildHighlightGeometry verwenden, um den Text in Geometry-Objekte zu konvertieren. Die erste Methode gibt die Geometrie des formatierten Texts zurück; die zweite Methode gibt die Geometrie des umgebenden Rechtecks des formatierten Texts zurück. Im folgenden Codebeispiel wird gezeigt, wie Sie ein FormattedText-Objekt erstellen und die Geometrien des formatierten Texts und dessen umgebenden Rechtecks abrufen.

/// <summary>
/// Create the outline geometry based on the formatted text.
/// </summary>
public void CreateText()
{
    System.Windows.FontStyle fontStyle = FontStyles.Normal;
    FontWeight fontWeight = FontWeights.Medium;

    if (Bold == true) fontWeight = FontWeights.Bold;
    if (Italic == true) fontStyle = FontStyles.Italic;

    // Create the formatted text based on the properties set.
    FormattedText formattedText = new FormattedText(
        Text,
        CultureInfo.GetCultureInfo("en-us"),
        FlowDirection.LeftToRight,
        new Typeface(
            Font,
            fontStyle,
            fontWeight,
            FontStretches.Normal),
        FontSize,
        System.Windows.Media.Brushes.Black // This brush does not matter since we use the geometry of the text.
        );

    // Build the geometry object that represents the text.
    _textGeometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0));

    // Build the geometry object that represents the text highlight.
    if (Highlight == true)
    {
        _textHighLightGeometry = formattedText.BuildHighlightGeometry(new System.Windows.Point(0, 0));
    }
}
''' <summary>
''' Create the outline geometry based on the formatted text.
''' </summary>
Public Sub CreateText()
    Dim fontStyle As FontStyle = FontStyles.Normal
    Dim fontWeight As FontWeight = FontWeights.Medium

    If Bold = True Then
        fontWeight = FontWeights.Bold
    End If
    If Italic = True Then
        fontStyle = FontStyles.Italic
    End If

    ' Create the formatted text based on the properties set.
    Dim formattedText As New FormattedText(Text, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, New Typeface(Font, fontStyle, fontWeight, FontStretches.Normal), FontSize, Brushes.Black) ' This brush does not matter since we use the geometry of the text.

    ' Build the geometry object that represents the text.
    _textGeometry = formattedText.BuildGeometry(New Point(0, 0))

    ' Build the geometry object that represents the text highlight.
    If Highlight = True Then
        _textHighLightGeometry = formattedText.BuildHighlightGeometry(New Point(0, 0))
    End If
End Sub

Um die abgerufenen Geometry-Objekte anzuzeigen, müssen Sie auf den DrawingContext des Objekts zugreifen, das den konvertierten Text anzeigt. In diesen Codebeispielen wird dieser Zugriff erreicht, indem ein benutzerdefiniertes Steuerelementobjekt erstellt wird, das von einer Klasse abgeleitet wird, die das benutzerdefinierte Rendering unterstützt.

Um Geometry-Objekte im benutzerdefinierten Steuerelement anzuzeigen, stellen Sie eine Außerkraftsetzung für die OnRender-Methode bereit. Ihre außer Kraft gesetzte Methode sollte die DrawGeometry-Methode verwenden, um die Geometry-Objekte zu zeichnen.

/// <summary>
/// OnRender override draws the geometry of the text and optional highlight.
/// </summary>
/// <param name="drawingContext">Drawing context of the OutlineText control.</param>
protected override void OnRender(DrawingContext drawingContext)
{
    // Draw the outline based on the properties that are set.
    drawingContext.DrawGeometry(Fill, new System.Windows.Media.Pen(Stroke, StrokeThickness), _textGeometry);

    // Draw the text highlight based on the properties that are set.
    if (Highlight == true)
    {
        drawingContext.DrawGeometry(null, new System.Windows.Media.Pen(Stroke, StrokeThickness), _textHighLightGeometry);
    }
}
''' <summary>
''' OnRender override draws the geometry of the text and optional highlight.
''' </summary>
''' <param name="drawingContext">Drawing context of the OutlineText control.</param>
Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext)
    ' Draw the outline based on the properties that are set.
    drawingContext.DrawGeometry(Fill, New Pen(Stroke, StrokeThickness), _textGeometry)

    ' Draw the text highlight based on the properties that are set.
    If Highlight = True Then
        drawingContext.DrawGeometry(Nothing, New Pen(Stroke, StrokeThickness), _textHighLightGeometry)
    End If
End Sub

Informationen zur Quelle des Beispiels des benutzerdefinierten Benutzersteuerelementobjekts finden Sie unter OutlineTextControl.cs für C# und OutlineTextControl.vb für Visual Basic.

Siehe auch