当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#.NET标签中的多种颜色》经验,为你挑选了3个好方法。

我正在寻找一种在单个C#/ .NET标签中显示多种颜色的方法.例如,标签显示一系列csv分隔值,每个值取决于它们落入的桶中的颜色.我宁愿不使用多个标签,因为值是可变长度,我不想使用动态布局.是否有本机支持?



1> MusiGenesis..:

.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.这是狗慢.


如果控件是自绘的,那么从`Control`继承可能比`UserControl`更有意义.

2> Phil Wright..:

您可以尝试使用RichTextBox,以便您可以为字符串获取多种颜色,然后将其设置为只读并删除边框.将背景颜色更改为与其所在的表格相同,您可能会使用它.



3> Marc Gravell..:

或者,您可以在适当的控件(例如WebBrowser)中以rtf或html的形式执行此操作。理想情况下,可能会需要更多的资源,但是它会很快运行。

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有