Frage

Ist es möglich, formatieren Sie bestimmten text in einer WinForm-Label, anstatt zu brechen, den text in mehrere Beschriftungen?Bitte ignorieren Sie die HTML-tags in den text des Etiketts;es ist nur verwendet, um mein Punkt, aus.

Zum Beispiel:

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

Die produzieren würde der text in der Beschriftung als:

Dies ist Fett text.Dies ist Kursiv text.

War es hilfreich?

Lösung

Das ist nicht möglich, mit einer WinForms-label, wie es ist.Das label hat genau eine Schrift, mit genau einer Größe und einem Gesicht.Sie haben ein paar Optionen:

  1. Verwenden Sie separate Etiketten
  2. Erstellen Sie ein neues Control-abgeleitete Klasse, die Ihren eigenen Zeichnung über GDI+ und verwenden, dass statt der Kennzeichnung;dies ist wahrscheinlich die beste option, da es Ihnen die vollständige Kontrolle über, wie zu beauftragen, die Kontrolle zu formatieren, dass Sie Ihren text
  3. Verwenden Sie ein Drittanbieter-Steuerelement label, das Sie einfügen von HTML-snippets (es gibt einen ganzen Haufen - check CodeProject);das wäre jemand anderes die Implementierung von #2.

Andere Tipps

Nicht wirklich, aber Sie könnten fake es mit einem nur-lese-RichTextBox ohne Grenzen.RichTextBox-Steuerelement unterstützt Rich-Text-Format (rtf).

Eine andere Problemumgehung, zu spät, um die Partei:wenn Sie nicht verwenden möchten eine Dritte Partei die Kontrolle, und du bist nur auf der Suche um Aufmerksamkeit zu text in Ihrem Etikett, und du bist ok mit Unterstreichungen, die Sie verwenden können, ein LinkLabel.

Beachten Sie, dass viele betrachten dies als eine 'usability-Verbrechen', aber wenn Sie nicht etwas zu entwerfen, für end-user consumption, dann kann es etwas sein, das Sie bereit sind zu haben, auf dem gewissen.

Der trick ist das hinzufügen deaktiviert links zu den teilen in Ihrem text, dass Sie wollen Unterstrichen, und dann weltweit legen Sie die link-Farben, um den rest des Etiketts.Sie können fast alle notwendigen Eigenschaften, die zur design-Zeit, abgesehen von den Links.Add() Stück, aber hier sind Sie in 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;

Ergebnis:

enter image description here

Gearbeitet Lösung für mich - verwenden von benutzerdefinierten RichEditBox.Mit den richtigen Eigenschaften wird es sah aus, als einfaches label mit Mut zu unterstützen.

1) Erste, fügen Sie Ihre benutzerdefinierte RichTextLabel Klasse mit Behinderten caret-Zeichen :

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) Split Satz Wörter mit IsSelected Flagge, die darüber entscheiden, ob das Wort sollte Fett oder nicht :

        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) Add-Funktion für das konvertieren Sie text, um gültige rtf (mit unicode-Unterstützung!) :

   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

Funktioniert wie ein Zauber für mich!Lösungen zusammengestellt von :

Gewusst wie: konvertieren einer Zeichenfolge in das RTF-Format in C#?

Formatieren von text in Rich-Text-Feld

So blenden Sie den Cursor in eine RichTextBox?

  1. Erstellen Sie die text als RTF-Datei in wordpad
  2. Erstellen Sie Rich-text-Steuerelement ohne Grenzen und editable = false
  3. Fügen Sie die RTF-Datei in das Projekt als eine Ressource
  4. In der Form1_load tun

    myRtfControl.Rtf = Resource1.MyRtfControlText

AutoRichLabel

      AutoRichLabel with formatted RTF content

Ich war der Lösung dieses problem durch den Bau einer UserControl enthält TransparentRichTextBox das ist readonly.Die TransparentRichTextBox ist ein RichTextBox das ermöglicht es, transparent zu sein:

TransparentRichTextBox.cs:

public class TransparentRichTextBox : RichTextBox
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr LoadLibrary(string lpFileName);

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams prams = base.CreateParams;
            if (TransparentRichTextBox.LoadLibrary("msftedit.dll") != IntPtr.Zero)
            {
                prams.ExStyle |= 0x020; // transparent 
                prams.ClassName = "RICHEDIT50W";
            }
            return prams;
        }
    }
}

Finale UserControl fungiert als wrapper TransparentRichTextBox.Leider hatte ich es zu begrenzen, AutoSize auf meine eigene Weise, weil die AutoSize der RichTextBox wurde gebrochen.

AutoRichLabel.designer.cs:

partial class AutoRichLabel
{
    /// <summary> 
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary> 
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Component Designer generated code

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.rtb = new TransparentRichTextBox();
        this.SuspendLayout();
        // 
        // rtb
        // 
        this.rtb.BorderStyle = System.Windows.Forms.BorderStyle.None;
        this.rtb.Dock = System.Windows.Forms.DockStyle.Fill;
        this.rtb.Location = new System.Drawing.Point(0, 0);
        this.rtb.Margin = new System.Windows.Forms.Padding(0);
        this.rtb.Name = "rtb";
        this.rtb.ReadOnly = true;
        this.rtb.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None;
        this.rtb.Size = new System.Drawing.Size(46, 30);
        this.rtb.TabIndex = 0;
        this.rtb.Text = "";
        this.rtb.WordWrap = false;
        this.rtb.ContentsResized += new System.Windows.Forms.ContentsResizedEventHandler(this.rtb_ContentsResized);
        // 
        // AutoRichLabel
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
        this.BackColor = System.Drawing.Color.Transparent;
        this.Controls.Add(this.rtb);
        this.Name = "AutoRichLabel";
        this.Size = new System.Drawing.Size(46, 30);
        this.ResumeLayout(false);

    }

    #endregion

    private TransparentRichTextBox rtb;
}

AutoRichLabel.cs:

/// <summary>
/// <para>An auto sized label with the ability to display text with formattings by using the Rich Text Format.</para>
/// <para>­</para>
/// <para>Short RTF syntax examples: </para>
/// <para>­</para>
/// <para>Paragraph: </para>
/// <para>{\pard This is a paragraph!\par}</para>
/// <para>­</para>
/// <para>Bold / Italic / Underline: </para>
/// <para>\b bold text\b0</para>
/// <para>\i italic text\i0</para>
/// <para>\ul underline text\ul0</para>
/// <para>­</para>
/// <para>Alternate color using color table: </para>
/// <para>{\colortbl ;\red0\green77\blue187;}{\pard The word \cf1 fish\cf0  is blue.\par</para>
/// <para>­</para>
/// <para>Additional information: </para>
/// <para>Always wrap every text in a paragraph. </para>
/// <para>Different tags can be stacked (i.e. \pard\b\i Bold and Italic\i0\b0\par)</para>
/// <para>The space behind a tag is ignored. So if you need a space behind it, insert two spaces (i.e. \pard The word \bBOLD\0  is bold.\par)</para>
/// <para>Full specification: http://www.biblioscape.com/rtf15_spec.htm </para>
/// </summary>
public partial class AutoRichLabel : UserControl
{
    /// <summary>
    /// The rich text content. 
    /// <para>­</para>
    /// <para>Short RTF syntax examples: </para>
    /// <para>­</para>
    /// <para>Paragraph: </para>
    /// <para>{\pard This is a paragraph!\par}</para>
    /// <para>­</para>
    /// <para>Bold / Italic / Underline: </para>
    /// <para>\b bold text\b0</para>
    /// <para>\i italic text\i0</para>
    /// <para>\ul underline text\ul0</para>
    /// <para>­</para>
    /// <para>Alternate color using color table: </para>
    /// <para>{\colortbl ;\red0\green77\blue187;}{\pard The word \cf1 fish\cf0  is blue.\par</para>
    /// <para>­</para>
    /// <para>Additional information: </para>
    /// <para>Always wrap every text in a paragraph. </para>
    /// <para>Different tags can be stacked (i.e. \pard\b\i Bold and Italic\i0\b0\par)</para>
    /// <para>The space behind a tag is ignored. So if you need a space behind it, insert two spaces (i.e. \pard The word \bBOLD\0  is bold.\par)</para>
    /// <para>Full specification: http://www.biblioscape.com/rtf15_spec.htm </para>
    /// </summary>
    [Browsable(true)]
    public string RtfContent
    {
        get
        {
            return this.rtb.Rtf;
        }
        set
        {
            this.rtb.WordWrap = false; // to prevent any display bugs, word wrap must be off while changing the rich text content. 
            this.rtb.Rtf = value.StartsWith(@"{\rtf1") ? value : @"{\rtf1" + value + "}"; // Setting the rich text content will trigger the ContentsResized event. 
            this.Fit(); // Override width and height. 
            this.rtb.WordWrap = this.WordWrap; // Set the word wrap back. 
        }
    }

    /// <summary>
    /// Dynamic width of the control. 
    /// </summary>
    [Browsable(false)]
    public new int Width
    {
        get
        {
            return base.Width;
        } 
    }

    /// <summary>
    /// Dynamic height of the control. 
    /// </summary>
    [Browsable(false)]
    public new int Height
    {
        get
        {
            return base.Height;
        }
    }

    /// <summary>
    /// The measured width based on the content. 
    /// </summary>
    public int DesiredWidth { get; private set; }

    /// <summary>
    /// The measured height based on the content. 
    /// </summary>
    public int DesiredHeight { get; private set; }

    /// <summary>
    /// Determines the text will be word wrapped. This is true, when the maximum size has been set. 
    /// </summary>
    public bool WordWrap { get; private set; }

    /// <summary>
    /// Constructor. 
    /// </summary>
    public AutoRichLabel()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Overrides the width and height with the measured width and height
    /// </summary>
    public void Fit()
    {
        base.Width = this.DesiredWidth;
        base.Height = this.DesiredHeight;
    }

    /// <summary>
    /// Will be called when the rich text content of the control changes. 
    /// </summary>
    private void rtb_ContentsResized(object sender, ContentsResizedEventArgs e)
    {
        this.AutoSize = false; // Disable auto size, else it will break everything
        this.WordWrap = this.MaximumSize.Width > 0; // Enable word wrap when the maximum width has been set. 
        this.DesiredWidth = this.rtb.WordWrap ? this.MaximumSize.Width : e.NewRectangle.Width; // Measure width. 
        this.DesiredHeight = this.MaximumSize.Height > 0 && this.MaximumSize.Height < e.NewRectangle.Height ? this.MaximumSize.Height : e.NewRectangle.Height; // Measure height. 
        this.Fit(); // Override width and height. 
    }
}

Die syntax der rich-text-format ist einfach:

Absatz:

{\pard This is a paragraph!\par}

Fett / Kursiv / Unterstrichen text:

\b bold text\b0
\i italic text\i0
\ul underline text\ul0

Alternative Farben mit der Farbpalette:

{\colortbl ;\red0\green77\blue187;}
{\pard The word \cf1 fish\cf0  is blue.\par

Aber bitte beachten Sie:Immer wickeln Sie jeden text in einem Absatz.Auch, verschiedene tags können gestapelt werden (d.h. \pard\b\i Bold and Italic\i0\b0\par) und das Leerzeichen hinter einem tag wird ignoriert.Also, wenn Sie brauchen einen Raum dahinter, setzen Sie zwei Leerzeichen (d.h. \pard The word \bBOLD\0 is bold.\par).Die Flucht \ oder { oder }, bitte benutzen Sie einen der führenden \.Für mehr Informationen es gibt ein vollständige Spezifikation des rich-text-format online.

Mit dieser sehr einfachen syntax können Sie etwas erstellen, wie Sie können sehen in die erste Bild.Der rich-text-Inhalte, die befestigt, um die RtfContent Eigentum meiner AutoRichLabel im ersten Bild war:

{\colortbl ;\red0\green77\blue187;}
{\pard\b BOLD\b0  \i ITALIC\i0  \ul UNDERLINE\ul0 \\\{\}\par}
{\pard\cf1\b BOLD\b0  \i ITALIC\i0  \ul UNDERLINE\ul0\cf0 \\\{\}\par}

AutoRichLabel with formatted RTF content

Wenn Sie möchten, dass word wrap, bitte set die maximale Breite auf die gewünschte Größe.Allerdings wird dieses Update die Breite auf die maximale Breite, auch wenn der text kürzer ist.

Haben Sie Spaß!

Es gibt einen ausgezeichneten Artikel von 2009 auf Code-Projekt mit dem Namen "Eine Professionelle HTML-Renderer Verwenden Sie"die sich um etwas ähnliches wie das original-poster will.

Ich benutze es erfolgreich in mehreren Projekten von uns.

Sehr einfache Lösung:

  1. Fügen Sie 2 Etiketten auf dem Formular, LabelA und LabelB
  2. Gehen Sie zu Eigenschaften für LabelA und dock es nach Links.
  3. Gehen Sie zu Eigenschaften für LabelB und dock es nach Links.
  4. Set-Schriftart Fett für LabelA .

Jetzt die LabelB Schicht wird je nach Länge des Textes von LabelA.

Das ist alles.

Ich Wäre auch interessiert zu erfahren, ob es möglich ist.

Wenn wir konnte nicht finden, eine Lösung, die wir Zuflucht, die Komponente Ones 'SuperLabel' - regler mit dem HTML-markup in einem label.

Zu realisieren ist dies eine alte Frage ist, meine Antwort ist mehr für diejenigen, wie mich, die noch auf der Suche nach solchen Lösungen und stolpern auf diese Frage.

Abgesehen von dem, was wurde bereits erwähnt, DevExpress s LabelControl ist ein label, das unterstützt dieses Verhalten - demo hier.Ach, es ist Teil einer bezahlten Bibliothek.

Wenn Sie suchen Kostenlose Lösungen, glaube ich HTML-Renderer die nächste beste Sache.

Ein FlowLayoutPanel funktioniert gut für Ihr problem.Wenn Sie Beschriftungen hinzufügen, um die flow-panel und format jedes label schriftart und die margin-Eigenschaften, dann können Sie verschiedene Schriftstile.Ziemlich schnelle und einfache Lösung, um zu arbeiten.

Ja.Sie können implementiert, mithilfe von HTML Rendern.Für Sie sehen, klicken Sie auf den link: https://htmlrenderer.codeplex.com/ Ich hoffe, dies ist nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top