Pergunta

Eu estou procurando uma maneira de exibir várias cores em uma. Rótulo único C # / NET. Por exemplo o rótulo está exibindo uma série de csv valores separados que cada take em uma cor dependendo de um balde que se incluem. Eu preferiria não usar vários rótulos, como os valores são de comprimento variável e eu não quero jogar com layouts dinâmicos. Existe um suporte nativo para isso?

Foi útil?

Solução

Não há controle nativa em .NET que faz isso. Sua melhor aposta é para escrever seu próprio UserControl (chamemos-lhe RainbowLabel ou algo assim). Normalmente você teria uma herdar o controle de etiqueta personalizada diretamente da etiqueta, mas desde que você não pode fazer um texto multi-colorido em uma etiqueta, você teria apenas que herdam de UserControl.

Para tornar o texto, seu UserControl pode dividir o texto em vírgulas e, em seguida, carregar dinamicamente um rótulo de cor diferente para cada pedaço. A melhor maneira, no entanto, seria a de tornar o texto diretamente no seu UserControl usando o cordão e MeasureString métodos no namespace Graphics.

Escrevendo UserControls em .NET não é realmente difícil, e esse tipo de problema incomum é exatamente o que UserControls personalizados são para.

Atualizar : aqui está um método simples que você pode usar para tornar o texto multi-colorido em um 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 vai quebrar se você tiver mais de 4 elementos delimitados por vírgula em seu texto, mas você começa a idéia. Além disso, parece haver uma pequena falha no MeasureString que torna retornar uma largura que é um par de pixels mais amplo do que o necessário, de modo a string multi-colorido aparece esticada para fora -. Você pode querer ajustar essa parte

Deve ser fácil de modificar este código para um UserControl.

Nota : TextRenderer é a melhor classe para uso para desenhar e medir cordas, uma vez que utiliza ints. Graphics.DrawString e .MeasureString uso flutuadores, então você vai ter erros off-por-a-pixel aqui e ali.

Atualizar : Esqueça sobre o uso TextRenderer. É cão lento.

Outras dicas

Você pode tentar usar um RichTextBox para que você possa obter várias cores para a corda e, em seguida, torná-lo somente leitura e remover a borda. Alterar a cor de fundo para o mesmo que o formulário está ligado e você pode fugir com ele.

Como alternativa, você pode fazer isso como rtf ou html em um controle adequado (como WebBrowser). Provavelmente, seria necessário um pouco mais recursos que você gostaria idealmente como, mas ele vai trabalhar com bastante rapidez.

Se você está construindo seu aplicativo Windows para pessoas com XP e para cima, você pode usar WPF. Mesmo que seja um aplicativo de formulários do Windows, você pode adicionar um UserControl WPF.

Eu, então, usar um rótulo, e defina a propriedade "Primeiro Plano" para ser um gradiente de cores.

Ou, no Windows Forms (sem WPF), você pode simplesmente usar um "Painel Flow", e depois em um loop adicionar várias etiquetas como segmentos de sua sentense ... todos eles vão "fluxo" em conjunto, como se ele foi um rótulo.

Um pouco fora do tópico ... Você pode verificar também:

Eu estou usando etiquetas coloridas, muitas vezes a palavras-chave da marca na cor vermelha etc. Como em resposta de Phil Wright usar um controle RichTextBox, remover a borda e definir a cor de fundo para SystemColors.Control.

Para escrever o texto colorido que o controle é primeiro limpo e então eu usar essa função para acrescentar 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ê deseja executar esta função com "mono", em seguida, adicionar um espaço antes de cada novo texto colorido, ou mono não irá definir novo a cor corretamente. Isso não é necessário com .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);

Você pode simplesmente usar várias etiquetas. Defina as propriedades de fonte que você deseja e, em seguida, usar a esquerda. superior e propriedades de largura para exibir as palavras que deseja exibir de forma diferente. Isso supõe que você está usando Windows Forms.

Tente este,

   labelId.Text = "Successfully sent to" + "<a style='color:Blue'> "  + name + "</a>"; 

Não há suporte nativo para isso; você terá que usar várias etiquetas ou encontrar um controle de 3rd-festa que vai fornecer essa funcionalidade.

Eu não penso assim. Você deve criar um você mesmo.

Como por sua Pergunta sua exigência é simples como lable.Text = "This color is Red", por isso têm de texto de exibição como esta "A cor é" estará em azul e "Red" será vermelho .. Isto pode ser feito como este

lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top