Condividi tramite


Procedura: creare testo con contorni

Nella maggior parte dei casi, quando si aggiungono ornamenti alle stringhe di testo in un'applicazione Windows Presentation Foundation (WPF), si utilizza il testo come un insieme di caratteri discreti, o glifi. Ad esempio, è possibile creare un pennello sfumato lineare e applicarlo alla proprietà Foreground di un oggetto TextBox. Quando viene visualizzata o modificata la casella di testo, il pennello sfumato lineare viene applicato automaticamente all'insieme corrente di caratteri nella stringa di testo.

Esempio di pennello sfumato lineare applicato a una casella di testo

Testo visualizzato con pennello sfumato lineare

Tuttavia, è anche possibile convertire il testo in oggetti Geometry, per creare altri tipi di testo visivamente dettagliato. Ad esempio, è possibile creare un oggetto Geometry in base alla struttura di una stringa di testo.

Esempio di pennello sfumato lineare applicato alla geometria della struttura del testo

Struttura di testo con pennello sfumato lineare

Se il testo viene convertito in un oggetto Geometry, non costituisce più un insieme di caratteri. Di conseguenza, non è possibile modificare i caratteri della stringa di testo. È tuttavia possibile intervenire sull'aspetto del testo convertito modificandone le proprietà di tratto e riempimento. Il tratto fa riferimento alla struttura del testo convertito, mentre il riempimento fa riferimento all'area all'interno della struttura del testo convertito.

Negli esempi seguenti vengono illustrate diverse modalità di creazione di effetti visivi mediante la modifica del tratto e del riempimento del testo convertito.

Esempio di impostazione di tratto e riempimento in colori diversi

Testo con colori diversi per tratto e riempimento

Esempio di tratto con immagine applicato al tratto

Testo con tratto con immagine applicato

È anche possibile modificare il rettangolo del riquadro delimitatore, o l'evidenziazione, del testo convertito. Nell'esempio riportato di seguito viene illustrata una modalità di creazione di effetti visivi mediante la modifica del tratto e dell'evidenziazione del testo convertito.

Esempio di tratto con immagine applicato al tratto e all'evidenziazione

Testo con tratto con immagine applicato

Esempio

La chiave per la conversione del testo in un oggetto Geometry consiste nell'utilizzare l'oggetto FormattedText. Una volta creato questo oggetto, è possibile utilizzare i metodi BuildGeometry e BuildHighlightGeometry per convertire il testo in oggetti Geometry. Il primo metodo restituisce la geometria del testo formattato, mentre il secondo restituisce la geometria del riquadro delimitatore del testo formattato. Nell'esempio di codice seguente viene illustrato come creare un oggetto FormattedText e recuperare le geometrie del testo formattato nonché il relativo riquadro delimitatore.

        ''' <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 hightlight.
            If Highlight = True Then
                _textHighLightGeometry = formattedText.BuildHighlightGeometry(New Point(0, 0))
            End If
        End Sub
/// <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 hightlight.
    if (Highlight == true)
    {
        _textHighLightGeometry = formattedText.BuildHighlightGeometry(new System.Windows.Point(0, 0));
    }
}

Per visualizzare gli oggetti Geometry recuperati, è necessario accedere all'oggetto DrawingContext dell'oggetto in cui viene visualizzato il testo convertito. In questi esempi di codice, questa operazione viene eseguita creando un oggetto controllo personalizzato derivato da una classe che supporta il rendering definito dall'utente.

Per visualizzare oggetti Geometry nel controllo personalizzato, fornire un override per il metodo OnRender. È necessario che il metodo sottoposto a override utilizzi il metodo DrawGeometry per disegnare gli oggetti 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 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
/// <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);
    }
}

Vedere anche

Concetti

Disegno di testo formattato