it-swarm.dev

C # .NET etiketinde birden çok renk

Tek bir C # /. NET etiketinde birden fazla renk görüntülemek için bir yol arıyorum. Örneğin, etiket, içine düştükleri bir kovaya bağlı olarak renk alan bir dizi csv ayrılmış değer gösterir. Değerler değişken uzunlukta olduğundan ve dinamik mizanpajlarla oynamak istemediğim için birden fazla etiket kullanmayı tercih etmem. Bunun için yerel bir destek var mı?

34
Cory

Bunu yapan .NET'te yerel denetim yok. En iyi bahis, kendi UserControl'unuzu yazmaktır (RainbowLabel ya da başka bir şey olarak adlandırınız). Normalde, doğrudan Label'dan miras alan bir özel etiket denetimine sahip olursunuz, ancak tek bir etikette çok renkli bir metin alamadığınız için, yalnızca UserControl'den miras alırsınız.

Metni oluşturmak için, UserControl'ünüz metni virgüllere bölebilir ve daha sonra her yığın için farklı renkte bir Etiketi dinamik olarak yükleyebilir. Bununla birlikte, daha iyi bir yol, Graphics ad alanındaki DrawString ve MeasureString yöntemlerini kullanarak metni doğrudan UserControl'ünüze oluşturmak olabilir.

UserControls .NET'te yazmak gerçekten zor değil ve bu tür olağandışı bir sorun tam olarak özel UserControls içindir.

Güncelleme : İşte PictureBox üzerinde çok renkli metni oluşturmak için kullanabileceğiniz basit bir yöntem:

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;
            }
        }
    }
}

Belli ki, metninizde virgülle ayrılmış 4'ten fazla öğe varsa, bu fikir bozulur, ancak fikir elde edersiniz. Ayrıca, MeasureString'de gerekenden daha geniş bir çift piksel genişliğini döndüren küçük bir aksaklık var gibi görünmektedir, bu yüzden çok renkli dize gerilmiş olarak görünmektedir - bu kısmı çimdiklemek isteyebilirsiniz.

Bir UserControl için bu kodu değiştirmek çok kolay olmalıdır.

Not : TextRenderer, dizeleri çizmek ve ölçmek için daha iyi bir sınıftır, çünkü ints kullanmaktadır. Graphics.DrawString ve .MeasureString yüzer kullanır, bu nedenle burada ve orada piksel dışı hatalar elde edersiniz.

Güncelleme : Unutmayın TextRenderer kullanımı hakkında. Yavaş köpek.

42
MusiGenesis

Bir RichTextBox kullanmayı deneyebilir, böylece dize için birden fazla renk elde edebilir ve sonra onu salt okunur hale getirebilir ve kenarlığı kaldırabilirsiniz. Arka plan rengini, üzerinde olduğu Form ile aynı şekilde değiştirin ve ondan kurtulabilirsiniz.

14
Phil Wright

Alternatif olarak, bunu uygun bir kontrolde (WebBrowser gibi) rtf veya html olarak yapabilirsiniz. Muhtemelen ideal olarak kullanmak isteyeceğiniz kaynaklardan biraz daha fazlasını alacaktır, ancak oldukça hızlı bir şekilde çalışacaktır.

4
Marc Gravell

Windows uygulamanızı XP ve üstü olan kişiler için oluşturuyorsanız, WPF'yi kullanabilirsiniz. Windows Forms uygulaması olsa bile, bir WPF UserControl ekleyebilirsiniz.

Sonra bir Etiket kullanır ve "Ön Plan" özelliğini bir renk gradyanı olarak ayarlardım.

Veya, Windows Formlarında (WPF yok), sadece bir "Akış Paneli" kullanabilirsiniz, ve sonra bir for döngüsünde cümlenizin parçaları olarak birden fazla Etiket ekleyin ... hepsi bir etiketmiş gibi "akacak" .

4
Timothy Khouri

Biraz konu dışı ... Ayrıca şunları da kontrol edebilirsiniz: 

1
Yordan Georgiev

Anahtar sözcükleri kırmızı renkte vb. Olarak işaretlemek için sık sık renkli etiketler kullanıyorum .. .. Phil Wright'ın cevabında olduğu gibi RichTextBox denetimi kullanıyorum, kenarlığı kaldırıyorum ve arka plan rengini SystemColors.Control'e ayarladım.

Renkli metin yazmak için önce kontrol silinir, sonra da renkli metin eklemek için bu işlevi kullanırım:

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();
    }

Bu işlevi "mono" ile çalıştırmak istiyorsanız, her yeni renkli metinden önce bir boşluk ekleyin, yoksa mono rengi doğru şekilde ayarlamaz. Bu .NET ile gerekli değildir

Kullanımı:

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);
0
harry4516

Bunu dene, 

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

Birden fazla etiket kullanabilirsiniz. İstediğiniz font özelliklerini ayarlayın ve ardından sol tarafını kullanın. Farklı şekilde görüntülenmesini istediğiniz kelimeleri görüntülemek için üst ve genişlik özellikleri. Bu, Windows formları kullandığınızı varsaymaktadır.

0
Chris Wegener