単一の C#/.NET ラベルに複数の色を表示する方法を探しています。たとえば、ラベルは一連の csv で区切られた値を表示しており、それぞれが該当するバケットに応じて色を付けています。値は可変長であり、動的なレイアウトで遊びたくないので、複数のラベルを使用したくないです。これに対するネイティブサポートはありますか?
11 に答える
これを行う .NET のネイティブ コントロールはありません。最善の策は、独自の UserControl を作成することです (RainbowLabel などと呼んでください)。通常、カスタム ラベル コントロールは Label から直接継承しますが、1 つのラベルで複数の色のテキストを取得することはできないため、UserControl から継承するだけです。
テキストをレンダリングするために、UserControl はテキストをカンマで分割し、チャンクごとに異なる色の Label を動的にロードできます。ただし、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 はフロートを使用するため、あちこちでピクセル単位のエラーが発生します。
更新: TextRenderer の使用を忘れてください。ドッグスローです。
RichTextBox を使用して、文字列に複数の色を取得し、読み取り専用にして境界線を削除できるようにすることができます。背景色をフォームと同じ色に変更すると、うまくいく可能性があります。
別の方法として、適切なコントロール (WebBrowser など) で rtf または html としてこれを行うこともできます。おそらく、理想的にはもう少し多くのリソースが必要になるでしょうが、かなり迅速に機能します。
XP 以上のユーザー向けの Windows アプリを構築する場合は、WPF を使用できます。Windows フォーム アプリであっても、WPF UserControl を追加できます。
次に、Label を使用し、「Foreground」プロパティを色のグラデーションに設定します。
または、Windows フォーム (WPF なし) では、「フロー パネル」を使用するだけで、for ループで複数のラベルを文のセグメントとして追加できます...それらはすべて、1 つのラベルであるかのように一緒に「流れ」ます。 .
トピックから少し外れています...次も確認できます。
複数のラベルを簡単に使用できます。必要なフォント プロパティを設定してから、左側を使用します。top および width プロパティを使用して、異なる方法で表示する単語を表示します。これは、Windows フォームを使用していることを前提としています。
これに対するネイティブ サポートはありません。複数のラベルを使用するか、この機能を提供するサードパーティ コントロールを見つける必要があります。
私はそうは思わない。自分で作成する必要があります。
あなたの質問によると、あなたの要件はのように単純です
lable.Text = "This color is Red"
、それでそれはこのようにテキストを表示しなければなりません「色は」は青になり、「赤」は赤になります..これはこのように行うことができます
lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"