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
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
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
Esempio di tratto con immagine applicato al tratto
È 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
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);
}
}