23 votes

Formatage du texte dans l'étiquette WinForm

Est-il possible de formater un certain texte dans une étiquette WinForm au lieu de diviser le texte en plusieurs étiquettes ? Veuillez ne pas tenir compte des balises HTML dans le texte de l'étiquette ; elles ne sont utilisées que pour faire passer mon message.

Par exemple :

Dim myLabel As New Label
myLabel.Text = "This is <b>bold</b> text.  This is <i>italicized</i> text."

Ce qui donnerait le texte suivant dans l'étiquette :

C'est en gras texte. [ ] en italique texte.

19voto

TheSmurf Points 10872

Ce n'est pas possible avec une étiquette WinForms telle qu'elle est. L'étiquette doit avoir exactement une police, avec exactement une taille et une face. Vous avez deux options :

  1. Utilisez des étiquettes séparées
  2. Créez une nouvelle classe dérivée du contrôle qui effectue son propre dessin via GDI+ et utilisez-la à la place de Label ; c'est probablement la meilleure option, car elle vous donne un contrôle total sur la façon dont vous demandez au contrôle de formater son texte.
  3. Utilisez un contrôle d'étiquette tiers qui vous permettra d'insérer des extraits HTML (il en existe un grand nombre - consultez CodeProject) ; il s'agirait de la mise en œuvre du point 2 par quelqu'un d'autre.

17voto

ageektrapped Points 7815

Pas vraiment, mais vous pouvez le simuler avec une RichTextBox en lecture seule sans bordures. RichTextBox prend en charge le format Rich Text Format (rtf).

14voto

Geoff Points 3094

Autre solution de contournement, tardive : si vous ne voulez pas utiliser un contrôle tiers et que vous cherchez simplement à attirer l'attention sur une partie du texte de votre étiquette, y si vous n'avez pas de problème avec le soulignement, vous pouvez utiliser une LinkLabel .

Notez que beaucoup considèrent cela comme un crime d'ergonomie Mais si vous ne concevez pas un produit destiné à être utilisé par l'utilisateur final, c'est peut-être une chose que vous êtes prêt à avoir sur la conscience.

L'astuce consiste à ajouter des liens désactivés aux parties de votre texte que vous souhaitez souligner, puis à définir globalement les couleurs des liens pour qu'elles correspondent au reste de l'étiquette. Vous pouvez définir presque toutes les propriétés nécessaires au moment de la conception, à l'exception de l'attribut Links.Add() pièce, mais les voici en code :

linkLabel1.Text = "You are accessing a government system, and all activity " +
                  "will be logged.  If you do not wish to continue, log out now.";
linkLabel1.AutoSize = false;
linkLabel1.Size = new Size(365, 50);
linkLabel1.TextAlign = ContentAlignment.MiddleCenter;
linkLabel1.Links.Clear();
linkLabel1.Links.Add(20, 17).Enabled = false;   // "government system"
linkLabel1.Links.Add(105, 11).Enabled = false;  // "log out now"
linkLabel1.LinkColor = linkLabel1.ForeColor;
linkLabel1.DisabledLinkColor = linkLabel1.ForeColor;

Résultat :

enter image description here

11voto

Nigrimmist Points 41

La solution a fonctionné pour moi - en utilisant une RichEditBox personnalisée. Avec les bonnes propriétés, elle sera considérée comme une simple étiquette avec support du gras.

1) Tout d'abord, ajoutez votre classe RichTextLabel personnalisée avec un signe d'insertion désactivé :

public class RichTextLabel : RichTextBox
{
    public RichTextLabel()
    {
        base.ReadOnly = true;
        base.BorderStyle = BorderStyle.None;
        base.TabStop = false;
        base.SetStyle(ControlStyles.Selectable, false);
        base.SetStyle(ControlStyles.UserMouse, true);
        base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

        base.MouseEnter += delegate(object sender, EventArgs e)
        {
            this.Cursor = Cursors.Default;
        };
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x204) return; // WM_RBUTTONDOWN
        if (m.Msg == 0x205) return; // WM_RBUTTONUP
        base.WndProc(ref m);
    }
}

2) Divisez votre phrase en mots avec le drapeau IsSelected, qui détermine si ce mot doit être mis en gras ou non :

        private void AutocompleteItemControl_Load(object sender, EventArgs e)
    {
        RichTextLabel rtl = new RichTextLabel();
        rtl.Font = new Font("MS Reference Sans Serif", 15.57F);
        StringBuilder sb = new StringBuilder();
        sb.Append(@"{\rtf1\ansi ");
        foreach (var wordPart in wordParts)
        {
            if (wordPart.IsSelected)
            {
                sb.Append(@"\b ");
            }
            sb.Append(ConvertString2RTF(wordPart.WordPart));
            if (wordPart.IsSelected)
            {
                sb.Append(@"\b0 ");
            }
        }
        sb.Append(@"}");

        rtl.Rtf = sb.ToString();
        rtl.Width = this.Width;
        this.Controls.Add(rtl);
    }

3) Ajout d'une fonction pour convertir votre texte en rtf valide (avec support de l'unicode !) :

   private string ConvertString2RTF(string input)
    {
        //first take care of special RTF chars
        StringBuilder backslashed = new StringBuilder(input);
        backslashed.Replace(@"\", @"\\");
        backslashed.Replace(@"{", @"\{");
        backslashed.Replace(@"}", @"\}");

        //then convert the string char by char
        StringBuilder sb = new StringBuilder();
        foreach (char character in backslashed.ToString())
        {
            if (character <= 0x7f)
                sb.Append(character);
            else
                sb.Append("\\u" + Convert.ToUInt32(character) + "?");
        }
        return sb.ToString();
    }

Sample

Cela fonctionne comme un charme pour moi ! Solutions compilées à partir de :

Comment convertir une chaîne de caractères en RTF en C# ?

Formater le texte dans une boîte de texte riche

Comment masquer le signe d'insertion dans une RichTextBox ?

5voto

Phil Points 1247
  1. Créer le texte comme un fichier RTF dans wordpad
  2. Créez un contrôle de texte riche sans bordure et éditable = faux.
  3. Ajouter le fichier RTF au projet en tant que ressource
  4. Dans le formulaire 1_load, faites

    myRtfControl.Rtf = Resource1.MyRtfControlText

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X