我正在寻找一种在单个C#/ .NET标签中显示多种颜色的方法。例如,标签显示一系列csv分隔值,每个值取决于它们所属的桶的颜色。我宁愿不使用多个标签,因为值是可变长度,我不想使用动态布局。是否有原生支持?
答案 0 :(得分:43)
.NET中没有本机控件可以执行此操作。最好的办法是编写自己的UserControl(称之为RainbowLabel或其他东西)。通常,您可以直接从Label继承自定义标签控件,但由于您无法在一个标签中获得多色文本,因此您只能从UserControl继承。
为了呈现文本,您的UserControl可以在逗号上拆分文本,然后为每个块动态加载不同颜色的Label。但是,更好的方法是使用Graphics命名空间中的DrawString和MeasureString方法将文本直接呈现到UserControl上。
在.NET中编写UserControl并不困难,这种不寻常的问题正是自定义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是一个更好的类,用于绘制和测量字符串,因为它使用整数。 Graphics.DrawString和.MeasureString使用浮点数,因此你会在这里和那里得到一个像素错误。
更新:忘记使用TextRenderer。这是狗慢。
答案 1 :(得分:15)
您可以尝试使用RichTextBox,以便您可以为字符串获取多种颜色,然后将其设置为只读并删除边框。将背景颜色更改为与其所在的表格相同,您可能会使用它。
答案 2 :(得分:4)
作为替代方法,您可以在合适的控件(例如WebBrowser)中将其作为rtf或html执行。它可能需要更多你想要的资源,但它会很快起作用。
答案 3 :(得分:4)
如果要为XP及以上版本的人构建Windows应用程序,可以使用WPF。即使它是Windows窗体应用程序,您也可以添加WPF UserControl。
然后我会使用Label,并将“Foreground”属性设置为渐变颜色。
或者,在Windows窗体(没有WPF)中,您可以只使用“流面板”,然后在for循环中添加多个标签作为您的句子的一部分......它们将全部“流动”在一起,就好像它一样是一个标签。
答案 4 :(得分:1)
稍微偏离主题......您也可以查看:
答案 5 :(得分: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();
}
如果要使用“mono”运行此功能,请在每个新彩色文本前添加一个空格,否则单声道将无法正确设置新颜色。这不是.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);
答案 6 :(得分:0)
您可以简单地使用多个标签。设置所需的字体属性,然后使用左侧。顶部和宽度属性,用于显示要以不同方式显示的单词。这假设您使用的是Windows窗体。
答案 7 :(得分:0)
试试这个,
labelId.Text = "Successfully sent to" + "<a style='color:Blue'> " + name + "</a>";
答案 8 :(得分:-2)
没有原生支持;您将需要使用多个标签或找到将提供此功能的第三方控件。
答案 9 :(得分:-2)
我不这么认为。你应该自己创建一个。
答案 10 :(得分:-3)
根据您的问题,您的要求很简单
lable.Text = "This color is Red"
,所以必须显示这样的文字
“颜色是”将是蓝色,“红色”将是红色。
这可以像这样完成
lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"