web-dev-qa-db-ja.com

C#.NETラベルの複数の色

単一のC#/。NETラベルで複数の色を表示する方法を探しています。たとえば、ラベルには一連のcsvで区切られた値が表示され、それぞれが該当するバケットに応じて色を帯びます。値は可変長であり、動的レイアウトを使用したくないので、複数のラベルを使用しないことをお勧めします。これに対するネイティブサポートはありますか?

34
Cory

これを行う.NETのネイティブコントロールはありません。最善の策は、独自のUserControl(RainbowLabelなどと呼ぶ)を作成することです。通常、カスタムラベルコントロールはLabelから直接継承しますが、1つのラベルでマルチカラーのテキストを取得できないため、UserControlから継承します。

テキストをレンダリングするために、UserControlはコンマでテキストを分割し、チャンクごとに異なる色のラベルを動的にロードできます。ただし、より良い方法は、Graphics名前空間のDrawStringメソッドとMeasureStringメソッドを使用して、テキストを直接UserControlにレンダリングすることです。

.NETでUserControlを作成することはそれほど難しくありません。この種の異常な問題は、カスタムUserControlがまさに使用するものです。

pdate:これは、PictureBoxでマルチカラーテキストをレンダリングするために使用できる簡単な方法です。

public void RenderRainbowText(string Text, PictureBox pb)
{
    // PictureBox needs an image to draw on
    pb.Image = new Bitmap(pb.Width, pb.Height);
    using (Graphics g = Graphics.FromImage(pb.Image))
    {
        // create all-white background for drawing
        SolidBrush brush = new SolidBrush(Color.White);
        g.FillRectangle(brush, 0, 0,
            pb.Image.Width, pb.Image.Height);
        // draw comma-delimited elements in multiple colors
        string[] chunks = Text.Split(',');
        brush = new SolidBrush(Color.Black);
        SolidBrush[] brushes = new SolidBrush[] { 
            new SolidBrush(Color.Red),
            new SolidBrush(Color.Green),
            new SolidBrush(Color.Blue),
            new SolidBrush(Color.Purple) };
        float x = 0;
        for (int i = 0; i < chunks.Length; i++)
        {
            // draw text in whatever color
            g.DrawString(chunks[i], pb.Font, brushes[i], x, 0);
            // measure text and advance x
            x += (g.MeasureString(chunks[i], pb.Font)).Width;
            // draw the comma back in, in black
            if (i < (chunks.Length - 1))
            {
                g.DrawString(",", pb.Font, brush, x, 0);
                x += (g.MeasureString(",", pb.Font)).Width;
            }
        }
    }
}

テキストに4つ以上のコンマ区切りの要素がある場合、これは明らかに失敗しますが、アイデアは得られます。また、MeasureStringには小さなグリッチがあり、必要に応じて数ピクセル広い幅を返すため、マルチカラーの文字列が引き伸ばされて表示されます。その部分を微調整することをお勧めします。

UserControlのこのコードを変更するのは簡単です。

:TextRendererは、intを使用するため、文字列の描画と測定に使用するのに適したクラスです。 Graphics.DrawStringと.MeasureStringは浮動小数点数を使用しているため、ピクセル単位のオフエラーが発生することがあります。

更新TextRendererの使用についてを忘れます。遅い犬です。

43
MusiGenesis

RichTextBoxを使用して文字列の複数の色を取得し、それを読み取り専用にして境界線を削除することができます。背景色を、フォームが表示されているフォームと同じ色に変更すると、問題が解決する場合があります。

15
Phil Wright

別の方法として、適切なコントロール(WebBrowserなど)でrtfまたはhtmlとしてこれを行うことができます。理想的にはもう少し多くのリソースが必要になりますが、かなり高速に動作します。

5
Marc Gravell

XP以上のユーザー向けにWindowsアプリを構築している場合は、WPFを使用できます。Windowsフォームアプリであっても、WPF UserControlを追加できます。

次に、Labelを使用して、 "Foreground"プロパティを色のグラデーションに設定します。

または、Windowsフォーム(WPFなし)では、「フローパネル」を使用するだけで、forループで複数のラベルを文のセグメントとして追加できます...それらはすべて1つのラベルであるかのようにまとめて「フロー」します。

4
Timothy Khouri

キーワードを赤い色などでマークするために、色付きのラベルを頻繁に使用しています。PhilWrightの回答のように、RichTextBoxコントロールを使用して、境界線を削除し、背景色をSystemColors.Controlに設定します。

色付きのテキストを書き込むには、まずコントロールをクリアしてから、この関数を使用して色付きのテキストを追加します。

private void rtb_AppendText(Font selfont, Color color, Color bcolor, 
                        string text, RichTextBox box)
    {
            // append the text to the RichTextBox control
            int start = box.TextLength;
            box.AppendText(text);
            int end = box.TextLength;

            // select the new text
            box.Select(start, end - start);
            // set the attributes of the new text
            box.SelectionColor = color;
            box.SelectionFont = selfont;
            box.SelectionBackColor = bcolor;
            // unselect
            box.Select(end, 0);

            // only required for multi line text to scroll to the end
            box.ScrollToCaret();
    }

この機能を「モノ」で実行したい場合は、すべての新しいカラーテキストの前にスペースを追加してください。そうしないと、モノは新しいカラーを正しく設定しません。これは.NETでは必要ありません

使用法:

myRtb.Text = "";
rtb_AppendText(new Font("Courier New", (float)10), 
                   Color.Red, SystemColors.Control, " my red text", myRtb);
rtb_AppendText(new Font("Courier New", (float)10), 
                   Color.Blue, SystemColors.Control, " followed by blue", myRtb);
1
harry4516

少しトピックから外れています...次の点も確認できます:

1
Yordan Georgiev

これを試して、

   labelId.Text = "Successfully sent to" + "<a style='color:Blue'> "  + name + "</a>"; 
0
Padmaja Vudatha

単純に複数のラベルを使用できます。必要なフォントプロパティを設定してから、左を使用します。 topおよびwidthプロパティを使用して、別の方法で表示したい単語を表示します。これは、Windowsフォームを使用していることを前提としています。

0
Chris Wegener