我正在寻找一种在单个C#/ .NET标签中显示多种颜色的方法.例如,标签显示一系列csv分隔值,每个值取决于它们落入的桶中的颜色.我宁愿不使用多个标签,因为值是可变长度,我不想使用动态布局.是否有本机支持?
.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.这是狗慢.
您可以尝试使用RichTextBox,以便您可以为字符串获取多种颜色,然后将其设置为只读并删除边框.将背景颜色更改为与其所在的表格相同,您可能会使用它.
或者,您可以在适当的控件(例如WebBrowser)中以rtf或html的形式执行此操作。理想情况下,可能会需要更多的资源,但是它会很快运行。