Várias colors em um label do c # .net

Eu estou procurando uma maneira de exibir várias colors em um único label C # / .net. Por exemplo, o label está exibindo uma série de valores separados por csv, cada um assumindo uma cor, dependendo do tipo de caixote em que eles se encheckboxm. Eu preferiria não usar vários labels, pois os valores são de comprimento variável e não quero reproduzir com layouts dynamics. Existe um suporte nativo para isso?

Não há controle nativo no .NET que faz isso. Sua melhor aposta é escrever seu próprio UserControl (chame-o de RainbowLabel ou algo assim). Normalmente você teria um controle de label personalizado herdado diretamente do Label, mas desde que você não pode obter texto multi-colorido em um label, você herdaria apenas de UserControl.

Para renderizar o texto, seu UserControl pode dividir o texto em vírgulas e, em seguida, carregar dinamicamente um label com colors diferentes para cada bloco. Uma maneira melhor, no entanto, seria processar o texto diretamente no seu UserControl usando os methods DrawString e MeasureString no namespace Graphics.

Escrever UserControls no .NET não é realmente difícil, e esse tipo de problema incomum é exatamente o que os UserControls personalizados fazem.

Atualização : aqui está um método simples que você pode usar para renderizar o texto multicolorido em uma 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; } } } } 

Obviamente, isso será quebrado se você tiver mais de 4 elementos delimitados por vírgula em seu texto, mas você entenderá a ideia. Além disso, parece haver uma pequena falha no MeasureString que faz com que ele retorne uma largura que é um par de pixels maior que o necessário, então a string multicolorida aparece esticada - você pode querer ajustar essa parte.

Deve ser simples modificar esse código para um UserControl.

Nota : TextRenderer é uma class melhor para desenhar e medir strings, já que usa ints. Graphics.DrawString e .MeasureString usam floats, portanto, você obterá erros off-a-pixel aqui e ali.

Atualização : esqueça de usar o TextRenderer. É cachorro lento.

Você pode tentar usar um RichTextBox para que você possa obter várias colors para a seqüência de caracteres e, em seguida, torná-lo somente leitura e remover a borda. Mude a cor de fundo para o mesmo que o formulário está em e você pode fugir com ele.

Como alternativa, você pode fazer isso como rtf ou html em um controle adequado (como o WebBrowser). Provavelmente precisaria de um pouco mais de resources que você gostaria, mas funcionaria rapidamente.

Se você está construindo seu aplicativo do Windows para pessoas com XP e para cima, você pode usar o WPF. Mesmo se for um aplicativo do Windows Forms, você pode adicionar um UserControl do WPF.

Em seguida, eu usaria um Label e defini a propriedade “Foreground” como um gradiente de colors.

Ou, no Windows Forms (sem WPF), você poderia simplesmente usar um “Painel de Fluxo” e, em um loop for, adicionar vários Labels como segmentos de seu sentense … eles todos “fluem” juntos como se fosse um label .

Ligeiramente fora do tópico … Você pode conferir também:

  • gerar tabela de colors html
  • colors do modelo em sql
  • o resultado

Você pode simplesmente usar vários labels. Defina as propriedades da fonte desejadas e use a esquerda. propriedades top e width para exibir as palavras que você deseja exibir de forma diferente. Isto está assumindo que você está usando formulários do windows.

Eu estou usando labels coloridos com bastante frequência para marcar palavras-chave na cor vermelha etc. Como na resposta de Phil Wright eu uso um controle RichTextBox, remova a borda e defina a cor de plano de fundo para SystemColors.Control.

Para escrever texto colorido, o controle é primeiro desmarcado e, em seguida, uso essa function para append texto colorido:

 private void rtb_AppendText(Font selfont, Color color, Color bcolor, string text, RichTextBox box) { // append the text to the RichTextBox control int start = box.TextLength; box.AppendText(text); int end = box.TextLength; // select the new text box.Select(start, end - start); // set the attributes of the new text box.SelectionColor = color; box.SelectionFont = selfont; box.SelectionBackColor = bcolor; // unselect box.Select(end, 0); // only required for multi line text to scroll to the end box.ScrollToCaret(); } 

Se você quiser executar essa function com “mono”, adicione um espaço antes de cada novo texto colorido ou o mono não definirá a cor corretamente. Isso não é necessário com o .NET

Uso:

 myRtb.Text = ""; rtb_AppendText(new Font("Courier New", (float)10), Color.Red, SystemColors.Control, " my red text", myRtb); rtb_AppendText(new Font("Courier New", (float)10), Color.Blue, SystemColors.Control, " followed by blue", myRtb); 

Tente isso

  labelId.Text = "Successfully sent to" + " " + name + ""; 

Não há suporte nativo para isso; você terá que usar vários labels ou encontrar um controle de terceiros que fornecerá essa funcionalidade.

Acho que não. Você deve criar um você mesmo.

Como por sua pergunta sua exigência é simples como lable.Text = "This color is Red" , por isso tem que exibir o texto como este “A cor é” será em azul e “vermelho” será a cor vermelha .. Isso pode ser feito assim

 lable.Text = "" + " The color is " +"" + ""Red""