23

テキストを複数のラベルに分割する代わりに、WinForm ラベルで特定のテキストをフォーマットすることは可能ですか? ラベルのテキスト内の HTML タグは無視してください。それは私の主張を理解するためにのみ使用されます。

例えば:

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

ラベルのテキストは次のようになります。

これは太字です。これは イタリック体のテキストです。

4

12 に答える 12

19

WinForms ラベルをそのまま使用することはできません。ラベルには、正確に 1 つのサイズと 1 つのフェイスを持つ 1 つのフォントが必要です。いくつかのオプションがあります。

  1. 別のラベルを使用する
  2. GDI+ を介して独自の描画を行う新しい Control 派生クラスを作成し、Label の代わりにそれを使用します。コントロールにテキストの書式を設定するように指示する方法を完全に制御できるため、これがおそらく最良のオプションです。
  3. HTML スニペットを挿入できるサードパーティのラベル コントロールを使用します (たくさんあります - CodeProject を確認してください)。これは、誰かが #2 を実装したものです。
于 2008-08-14T16:45:50.810 に答える
17

そうではありませんが、境界線のない読み取り専用の RichTextBox を使用して偽造することはできます。RichTextBox はリッチ テキスト形式 (rtf) をサポートしています。

于 2008-08-14T17:07:39.970 に答える
14

別の回避策として、サード パーティ製のコントロールを使用したくない場合、ラベルのテキストの一部に注意を向けたいだけで、下線を使用しても問題ない場合は、 LinkLabel。 _

多くの人がこれを「ユーザビリティ犯罪」と考えていることに注意してください。ただし、エンド ユーザーが消費するものを設計していない場合は、良心に訴える準備ができている可能性があります。

秘訣は、下線を引きたいテキストの部分に無効なリンクを追加し、ラベルの残りの部分と一致するようにリンクの色をグローバルに設定することです。部品とは別に、設計時に必要なほとんどすべてのプロパティを設定できますがLinks.Add()、ここではコードで示しています。

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;

結果:

ここに画像の説明を入力

于 2014-06-13T14:28:16.537 に答える
11

私にとってはうまくいった解決策 - カスタムRichEditBoxを使用しています。適切なプロパティを使用すると、太字のサポートが付いたシンプルなラベルのように見えます。

1)まず、キャレットを無効にしたカスタム RichTextLabel クラスを追加します。

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) IsSelected フラグを使用して文を単語に分割し、その単語を太字にするか、または no にするかを決定します。

        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)テキストを有効な rtf に変換する関数を追加します (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();
    }

サンプル

私にとって魅力のように機能します!からコンパイルされたソリューション:

C#で文字列をRTFに変換するには?

リッチ テキスト ボックスのテキストの書式設定

RichTextBoxでキャレットを非表示にする方法は?

于 2015-02-25T20:20:12.347 に答える
5
  1. ワードパッドでテキストを RTF ファイルとして作成する
  2. 境界線がなく、編集可能 = false のリッチ テキスト コントロールを作成します。
  3. RTF ファイルをリソースとしてプロジェクトに追加する
  4. Form1_load で

    myRtfControl.Rtf = Resource1.MyRtfControlText

于 2009-10-21T16:58:53.433 に答える
3

オートリッチ ラベル

      書式設定された RTF コンテンツを含む AutoRichLabel

読み取り専用のUserControlを含むを構築することで、この問題を解決していました。TransparentRichTextBoxTransparentRichTextBoxRichTextBox透明にすることができる です。

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;
        }
    }
}

finalUserControlは のラッパーとして機能しますTransparentRichTextBox。残念ながら、のが壊れてしまっAutoSizeたので、私は自分の方法でそれを制限しなければなりませんでした。AutoSizeRichTextBox

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. 
    }
}

リッチ テキスト形式の構文は非常に単純です。

段落:

{\pard This is a paragraph!\par}

太字/斜体/下線テキスト:

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

カラーテーブルを使用した代替色:

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

ただし、次の点に注意してください: 常にすべてのテキストを段落で折り返します。また、異なるタグを積み重ねることができ (つまり\pard\b\i Bold and Italic\i0\b0\par)、タグの後ろのスペース文字は無視されます。したがって、後ろにスペースが必要な場合は、スペースを 2 つ挿入します (つまり\pard The word \bBOLD\0 is bold.\par)。\orをエスケープ{する}には、先頭に を使用してください\。詳細については、リッチ テキスト形式の完全な仕様がオンラインにあります

この非常に単純な構文を使用すると、最初の画像に見られるようなものを作成できます。最初の画像RtfContentで my のプロパティに添付されたリッチ テキスト コンテンツは次のとおりです。AutoRichLabel

{\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}

書式設定された RTF コンテンツを含む AutoRichLabel

ワードラップを有効にする場合は、最大幅を希望のサイズに設定してください。ただし、これにより、テキストがより短い場合でも、幅が最大幅に固定されます。

楽しむ!

于 2015-10-19T09:52:48.530 に答える
2

非常に簡単な解決策:

  1. フォームに 2 つのラベル、LabelA と LabelB を追加します。
  2. LabelA のプロパティに移動し、左にドッキングします。
  3. LabelB のプロパティに移動し、左にもドッキングします。
  4. LabelA の Font を太字に設定します。

これで、LabelA のテキストの長さに応じて LabelB がシフトします。

それで全部です。

于 2014-04-16T15:42:09.957 に答える
2

元の投稿者が望んでいるものに似たものを実装する「 A Professional HTML Renderer You Will Use 」という名前の Code Project に関する 2009 年の優れた記事があります。

私は私たちのいくつかのプロジェクトでそれをうまく使用しています。

于 2011-12-30T08:19:41.117 に答える
1

それが可能かどうかを調べることにも興味があります。

解決策が見つからなかったとき、ラベルに HTML マークアップを許可する Component Ones の「SuperLabel」コントロールに頼りました。

于 2008-08-14T16:45:14.430 に答える
1

これが古い質問であることを理解すると、私の答えは、私のように、まだそのような解決策を探していて、この質問に出くわす可能性のある人向けです.

すでに述べたこととは別に、DevExpress のLabelControlは、この動作をサポートするラベルです -デモはこちら。残念ながら、それは有料ライブラリの一部です。

無料のソリューションを探しているなら、HTML Rendererが次善の策だと思います。

于 2014-02-27T15:36:14.237 に答える
0

うん。HTML Render を使用して実装できます。ご覧のとおり、リンクをクリックしてください: https://htmlrenderer.codeplex.com/ これがお役に立てば幸いです。

于 2015-04-01T15:45:41.760 に答える