C#.NETラベルの複数の色
-
07-07-2019 - |
質問
単一のC#/。NETラベルに複数の色を表示する方法を探しています。たとえば、ラベルには、CSVで区切られた一連の値が表示されます。それぞれの値は、分類されるバケットに応じて色を取ります。値は可変長であり、動的なレイアウトを使用したくないため、複数のラベルを使用しないことをお勧めします。これに対するネイティブサポートはありますか?
解決
.NETにはこれを行うネイティブコントロールはありません。最善の策は、独自のUserControl(RainbowLabelまたは何かと呼びます)を記述することです。通常、カスタムラベルコントロールはLabelから直接継承しますが、1つのラベルでマルチカラーテキストを取得できないため、UserControlから継承するだけです。
テキストをレンダリングするために、UserControlはコンマでテキストを分割し、各チャンクに対して異なる色のラベルを動的にロードできます。ただし、Graphics名前空間のDrawStringメソッドとMeasureStringメソッドを使用して、テキストを直接UserControlにレンダリングする方が良い方法です。
.NETでのUserControlsの作成は本当に難しくありません。この種の異常な問題は、まさにカスタムUserControlsの目的です。
更新: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はfloatを使用するため、あちこちでピクセル単位のエラーが発生します。
更新:TextRendererの使用について忘れる。遅い犬です。
他のヒント
RichTextBoxを使用して、文字列に複数の色を設定し、読み取り専用にして境界線を削除することができます。背景色を現在のフォームと同じ色に変更すると、うまくいくかもしれません。
代わりに、適切なコントロール(WebBrowserなど)でrtfまたはhtmlとしてこれを行うことができます。理想的にはもう少しリソースが必要かもしれませんが、かなり速く動作します。
XP以上のユーザー向けにWindowsアプリを構築している場合は、WPFを使用できます。 Windows Formsアプリであっても、WPF UserControlを追加できます。
ラベルを使用して、「前景」を設定します。プロパティは色のグラデーションになります。
または、Windowsフォーム(WPFなし)では、「フローパネル」を使用するだけで、forループで複数のラベルをセンテンスのセグメントとして追加できます。それらはすべて「フロー」になります。まるで1つのラベルであるかのように。
トピックから少し外れています...確認することもできます:
キーワードを赤などでマークするために色付きのラベルを頻繁に使用しています。 Phil Wrightの答えのように、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();
}
&quot; mono&quot;でこの関数を実行する場合次に、新しい色付きテキストの前にスペースを追加します。そうしないと、モノは新しい色を正しく設定しません。これは.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);
単に複数のラベルを使用できます。必要なフォントプロパティを設定してから、左側を使用します。 topおよびwidthプロパティを使用して、表示する単語を別々に表示します。これは、Windowsフォームを使用していることを前提としています。
これを試してください、
labelId.Text = "Successfully sent to" + "<a style='color:Blue'> " + name + "</a>";
これに対するネイティブサポートはありません。複数のラベルを使用するか、この機能を提供するサードパーティコントロールを見つける必要があります。
そうは思いません。自分で作成する必要があります。
質問ごとに、要件は次のように簡単です
lable.Text =&quot;この色は赤です、したがって、このようなテキストを表示する必要があります
「色は」青になり、「赤」になります。赤色になります..
これは次のように実行できます
lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"