Så här: Skapa text med kontur

I de flesta fall när du lägger till prydnad i textsträngar i ditt WPF-program (Windows Presentation Foundation) använder du text i form av en samling diskreta tecken eller glyfer. Du kan till exempel skapa en linjär gradientpensel och tillämpa den på egenskapen Foreground för en TextBox objekt. När du visar eller redigerar textrutan tillämpas den linjära toningspenseln automatiskt på den aktuella uppsättningen tecken i textsträngen.

Text som visas med ett linjärt övertoningsverktyg

Men du kan också konvertera text till Geometry-objekt, vilket låter dig skapa andra typer av visuellt rika texter. Du kan till exempel skapa ett Geometry objekt baserat på konturen av en textsträng.

textkontur med hjälp av en linjär gradientpensel

När text konverteras till ett Geometry objekt är det inte längre en samling tecken– du kan inte ändra tecknen i textsträngen. Du kan dock påverka utseendet på den konverterade texten genom att ändra dess linje- och fyllningsegenskaper. Strecket refererar till konturen av den konverterade texten; fyllningen syftar på området inuti konturen för den konverterade texten.

I följande exempel visas flera sätt att skapa visuella effekter genom att ändra linje och fyllning av konverterad text.

Text med olika färger för fyllning och kontur

text med bildpensel som applicerats på linje

Det går också att ändra rektangeln för avgränsningsrutan eller markera den konverterade texten. I följande exempel visas ett sätt att skapa visuella effekter genom att ändra streck och markeringar av konverterad text.

Text med bildpensel tillämpad på streck och markering

Exempel

Nyckeln till att konvertera text till ett Geometry objekt är att använda objektet FormattedText. När du har skapat det här objektet kan du använda metoderna BuildGeometry och BuildHighlightGeometry för att konvertera texten till Geometry objekt. Den första metoden returnerar geometrin för den formaterade texten. den andra metoden returnerar geometrin för den formaterade textens avgränsningsruta. I följande kodexempel visas hur du skapar ett FormattedText objekt och hämtar geometrierna för den formaterade texten och dess avgränsningsruta.

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

För att kunna visa de hämtade Geometry objekten måste du komma åt DrawingContext för objektet som visar den konverterade texten. I dessa kodexempel uppnås den här åtkomsten genom att skapa ett anpassat kontrollobjekt som härleds från en klass som stöder användardefinierad återgivning.

Om du vill visa Geometry objekt i den anpassade kontrollen anger du en åsidosättning för metoden OnRender. Den åsidosatta metoden bör använda DrawGeometry-metoden för att rendera objekt Geometry.

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

Källan till exempelobjektet för anpassad användarkontroll finns i OutlineTextControl.cs för C# och OutlineTextControl.vb för Visual Basic.

Se även