一尘不染

C#.NET标签中的多种颜色

c#

我正在寻找一种在单个C#/。NET标签中显示多种颜色的方法。例如,标签显示了一系列由csv分隔的值,每个值取一个颜色取决于它们所属的存储桶。我不希望使用多个标签,因为值是可变长度的,并且我不想使用动态布局。有本地支持吗?


阅读 311

收藏
2020-05-19

共1个答案

一尘不染

.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。狗慢。

2020-05-19