我正在寻找一种在单个C#/。NET标签中显示多种颜色的方法。例如,标签显示了一系列由csv分隔的值,每个值取一个颜色取决于它们所属的存储桶。我不希望使用多个标签,因为值是可变长度的,并且我不想使用动态布局。有本地支持吗?
.NET中没有本机控件可以执行此操作。最好的选择是编写自己的UserControl(称为RainbowLabel之类的东西)。通常,您将有一个自定义标签控件直接从Label继承,但是由于您无法在一个标签中获得多色文本,因此您只能从UserControl继承。
为了呈现文本,您的UserControl可以将文本分割为逗号,然后为每个块动态加载不同颜色的Label。但是,更好的方法是使用Graphics命名空间中的DrawString和MeasureString方法将文本直接呈现到UserControl上。
在.NET中编写UserControl确实并不困难,而这种不寻常的问题正是自定义UserControl的目的所在。
更新 :这是一种可用于在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; } } } }
显然,如果您的文本中包含四个以上以逗号分隔的元素,则此操作会中断,但是您可以理解。另外,在MeasureString中似乎有一个小故障,使它返回的宽度比必要的宽度宽了几个像素,因此,多色的字符串显得有些拉长- 您可能想要调整该部分。
修改UserControl的代码应该很简单。
注意 :TextRenderer是用于绘制和测量字符串的更好的类,因为它使用整数。Graphics.DrawString和.MeasureString使用浮点数,因此到处都会出现逐像素错误。
更新 : 忘 了使用TextRenderer。狗慢。