gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:03:29 25 4
gpt4 key购买 nike

我正在寻找一种在单个 C#/.NET 标签中显示多种颜色的方法。例如,标签显示一系列 csv 分隔值,每个值根据它们落入的桶呈现不同的颜色。我不想使用多个标签,因为值是可变长度的,我不想玩动态布局。对此有原生支持吗?

最佳答案

.NET 中没有执行此操作的 native 控件。最好的办法是编写自己的 UserControl(将其称为 RainbowLabel 或其他名称)。通常您会拥有一个直接从 Label 继承的自定义标签控件,但由于您无法在一个标签中获得多色文本,因此您只能从 UserControl 继承。

为了呈现文本,您的 UserControl 可以用逗号分隔文本,然后为每个 block 动态加载不同颜色的标签。然而,更好的方法是使用 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;
}
}
}
}

显然,如果您的文本中有超过 4 个以逗号分隔的元素,这将会中断,但您明白了。此外,MeasureString 中似乎存在一个小故障,导致它返回的宽度比必要的宽几个像素,因此多色字符串看起来被拉长了 - 您可能需要调整该部分。

为 UserControl 修改此代码应该很简单。

注意:TextRenderer 是一个更好的用于绘制和测量字符串的类,因为它使用整数。 Graphics.DrawString 和 .MeasureString 使用 float ,因此您会到处出现像素错误。

更新:忘记使用 TextRenderer。狗慢。

关于c# - C# .NET 标签中的多种颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com