Partager via


Guide pratique pour créer du texte hiérarchique

Dans la plupart des cas, lorsque vous ajoutez une ornementation à des chaînes de texte dans votre application WPF (Windows Presentation Foundation), vous utilisez du texte en termes de collection de caractères discrets ou de glyphes. Par exemple, vous pouvez créer un pinceau de dégradé linéaire et l’appliquer à la Foreground propriété d’un TextBox objet. Lorsque vous affichez ou modifiez la zone de texte, le pinceau de dégradé linéaire est automatiquement appliqué au jeu actuel de caractères dans la chaîne de texte.

Text displayed with a linear gradient brush

Toutefois, vous pouvez également convertir du texte en Geometry objets, ce qui vous permet de créer d’autres types de texte enrichi visuellement. Par exemple, vous pouvez créer un Geometry objet en fonction du contour d’une chaîne de texte.

Text outline using a linear gradient brush

Lorsque le texte est converti en Geometry objet, il ne s’agit plus d’une collection de caractères. Vous ne pouvez pas modifier les caractères de la chaîne de texte. Vous pouvez néanmoins modifier l’apparence du texte converti en changeant ses propriétés de trait et de remplissage. Le trait fait référence au contour du texte converti et le remplissage à la zone située à l’intérieur du contour du texte converti.

Les exemples suivants illustrent plusieurs façons de créer des effets visuels en modifiant le trait et le remplissage du texte converti.

Text with different colors for fill and stroke

Text with image brush applied to stroke

Il est également possible de modifier le rectangle de zone englobante, ou de mettre en surbrillance, du texte converti. L’exemple suivant illustre un moyen de créer des effets visuels en modifiant le trait et la mise en surbrillance du texte converti.

Text with image brush applied to stroke and highlight

Exemple

La clé permettant de convertir du texte en objet Geometry consiste à utiliser l’objet FormattedText . Une fois que vous avez créé cet objet, vous pouvez utiliser les méthodes et BuildHighlightGeometry les BuildGeometry méthodes pour convertir le texte en Geometry objets. La première méthode retourne la géométrie du texte mis en forme ; la deuxième méthode retourne la géométrie du cadre englobant du texte mis en forme. L’exemple de code suivant montre comment créer un FormattedText objet et récupérer les géométries du texte mis en forme et sa zone englobante.

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

Pour afficher les objets récupérés Geometry , vous devez accéder à l’objet DrawingContext qui affiche le texte converti. Dans ces exemples de code, cet accès est obtenu en créant un objet de contrôle personnalisé dérivé d’une classe qui prend en charge le rendu défini par l’utilisateur.

Pour afficher des Geometry objets dans le contrôle personnalisé, fournissez un remplacement pour la OnRender méthode. Votre méthode substituée doit utiliser la DrawGeometry méthode pour dessiner les Geometry objets.

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

Pour obtenir la source de l’exemple d’objet de contrôle utilisateur personnalisé, consultez OutlineTextControl.cs pour C# et OutlineTextControl.vb pour Visual Basic.

Voir aussi