単一のC#/。NETラベルで複数の色を表示する方法を探しています。たとえば、ラベルには一連のcsvで区切られた値が表示され、それぞれが該当するバケットに応じて色を帯びます。値は可変長であり、動的レイアウトを使用したくないので、複数のラベルを使用しないことをお勧めします。これに対するネイティブサポートはありますか?
これを行う.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の使用についてを忘れます。遅い犬です。
RichTextBoxを使用して文字列の複数の色を取得し、それを読み取り専用にして境界線を削除することができます。背景色を、フォームが表示されているフォームと同じ色に変更すると、問題が解決する場合があります。
別の方法として、適切なコントロール(WebBrowserなど)でrtfまたはhtmlとしてこれを行うことができます。理想的にはもう少し多くのリソースが必要になりますが、かなり高速に動作します。
XP以上のユーザー向けにWindowsアプリを構築している場合は、WPFを使用できます。Windowsフォームアプリであっても、WPF UserControlを追加できます。
次に、Labelを使用して、 "Foreground"プロパティを色のグラデーションに設定します。
または、Windowsフォーム(WPFなし)では、「フローパネル」を使用するだけで、forループで複数のラベルを文のセグメントとして追加できます...それらはすべて1つのラベルであるかのようにまとめて「フロー」します。
キーワードを赤い色などでマークするために、色付きのラベルを頻繁に使用しています。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);
少しトピックから外れています...次の点も確認できます:
これを試して、
labelId.Text = "Successfully sent to" + "<a style='color:Blue'> " + name + "</a>";
単純に複数のラベルを使用できます。必要なフォントプロパティを設定してから、左を使用します。 topおよびwidthプロパティを使用して、別の方法で表示したい単語を表示します。これは、Windowsフォームを使用していることを前提としています。