Sdílet prostřednictvím


Jak na to: Vytvoření textu s obrysem

Ve většině případů při přidávání ornamentů do textových řetězců v aplikaci Windows Presentation Foundation (WPF) používáte text z hlediska kolekce diskrétních znaků nebo glyfů. Můžete například vytvořit lineární gradientový štětec a použít ho na Foreground vlastnost TextBox objektu. Při zobrazení nebo úpravě textového pole se štětce lineárního přechodu automaticky použije na aktuální sadu znaků v textovém řetězci.

Text zobrazený pomocí lineárního přechodového štětce

Můžete ale také převést text na objekty Geometry, což vám umožní vytvářet další typy vizuálně formátovaného textu. Můžete například vytvořit objekt Geometry na základě obrysu textového řetězce.

obrys textu pomocí lineárního přechodového štětce

Když je text převeden na objekt Geometry, už se nejedná o kolekci znaků – znaky v textovém řetězci nelze upravovat. Můžete ovlivnit vzhled převedeného textu úpravou jeho vlastností tahu a výplně. Tah odkazuje na obrys převedeného textu; výplň odkazuje na oblast uvnitř obrysu převedeného textu.

Následující příklady ilustrují několik způsobů vytváření vizuálních efektů úpravou tahu a výplně převedeného textu.

Text s různými barvami pro výplň a obrys

Text s obrázkovým štětcem použitým na tah

Obdélník ohraničujícího rámečku nebo zvýraznění převedeného textu je také možné upravit. Následující příklad ukazuje způsob, jak vytvořit vizuální efekty úpravou tahu a zvýraznění převedeného textu.

Text s obrázkovým štětcem aplikovaným na tah a zvýraznění

Příklad

Klíčem k převodu textu na objekt Geometry je použití objektu FormattedText. Po vytvoření tohoto objektu můžete pomocí BuildGeometry a BuildHighlightGeometry metod převést text na objekty Geometry. První metoda vrátí geometrii formátovaného textu; druhá metoda vrátí geometrii ohraničujícího pole formátovaného textu. Následující příklad kódu ukazuje, jak vytvořit objekt FormattedText a načíst geometrie formátovaného textu a jeho ohraničujícího pole.

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

Pokud chcete zobrazit načtené objekty Geometry, musíte získat přístup k DrawingContext objektu, který zobrazuje převedený text. V těchto příkladech kódu se tento přístup dosahuje vytvořením vlastního řídicího objektu odvozeného z třídy, která podporuje uživatelem definované vykreslování.

Chcete-li zobrazit Geometry objekty ve vlastním ovládacím prvku, je třeba přepsat metodu OnRender. Přepsaná metoda by měla použít metodu DrawGeometry k vykreslení Geometry objektů.

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

Zdroj ukázkového objektu vlastního uživatelského ovládacího prvku naleznete v tématu OutlineTextControl.cs pro jazyk C# a OutlineTextControl.vb pro Visual Basic.

Viz také