문제

나는 단일 c#/. net 레이블로 여러 색상을 표시하는 방법을 찾고 있습니다. 예를 들어 레이블은 그들이 내리는 버킷에 따라 색상을 취하는 일련의 CSV 분리 된 값을 표시합니다. 값은 가변 길이이며 동적 레이아웃을 사용하고 싶지 않기 때문에 여러 라벨을 사용하지 않기를 원합니다. 이것에 대한 기본 지원이 있습니까?

도움이 되었습니까?

해결책

.NET에는이를 수행하는 기본 제어가 없습니다. 가장 좋은 방법은 자신의 Usercontrol을 작성하는 것입니다 (Rainbowlabel 또는 Something이라고합니다). 일반적으로 레이블에서 직접 사용자 정의 레이블 컨트롤이 상속되지만 하나의 레이블로 멀티 컬러 텍스트를 얻을 수 없으므로 UserControl에서 상속됩니다.

텍스트를 렌더링하기 위해 UserControl은 텍스트를 쉼표로 분할 한 다음 각 청크에 대해 다른 색상의 레이블을 동적으로로드 할 수 있습니다. 그러나 더 나은 방법은 그래픽 네임 스페이스에서 DrawString 및 MeasureString 메소드를 사용하여 텍스트를 USERControl에 직접 렌더링하는 것입니다.

.NET에 USERCONTROLS를 작성하는 것은 실제로 어렵지 않으며, 이러한 종류의 특이한 문제는 맞춤형 usercontrols의 정확한 것입니다.

업데이트: 그림 상자에서 멀티 컬러 텍스트를 렌더링하는 데 사용할 수있는 간단한 방법이 있습니다.

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 개 이상의 쉼표로 변형 된 요소가 있으면 깨지지 만 아이디어를 얻을 수 있습니다. 또한 측정 값에 작은 글리치가있는 것으로 보이며, 필요한 것보다 더 넓은 두 픽셀 인 너비를 반환하게하기 때문에 멀티 컬러 문자열이 늘어난 것처럼 보입니다. 해당 부분을 조정하고 싶을 수도 있습니다.

USERCONTROL 의이 코드를 수정하는 것이 간단해야합니다.

메모: Textrenderer는 ints를 사용하기 때문에 문자열을 그리거나 측정하는 데 사용하기에 더 나은 클래스입니다. Graphics.DrawString 및 .measurestring 사용 플로트가 있으므로 여기 저기 픽셀 오류가 발생합니다.

업데이트: 잊다 Textrenderer 사용에 대해. 개가 느린다.

다른 팁

RichTextBox를 사용하여 문자열의 여러 색상을 얻은 다음 읽고 테두리를 제거 할 수 있습니다. 배경색을 켜져있는 형태와 동일하게 변경하면 멀리 도망 갈 수 있습니다.

대안으로, 당신은 적절한 컨트롤 (예 : Webbrowser)에서 RTF 또는 HTML로 이것을 할 수 있습니다. 아마도 당신이 이상적으로 좋아하는 리소스가 좀 더 필요할 것이지만, 상당히 빨리 작동 할 것입니다.

XP 이상의 사람들을위한 Windows 앱을 구축하는 경우 WPF를 사용할 수 있습니다. Windows Forms 앱이더라도 WPF UserControl을 추가 할 수 있습니다.

그런 다음 레이블을 사용하여 "전경"속성을 색상의 기울기로 설정합니다.

또는 Windows 양식 (WPF 없음)에서 "Flow Panel"만 사용할 수 있으며 For Loop에서 여러 개의 라벨을 보낸 센스의 세그먼트로 추가 할 수 있습니다. .

약간의 주제를 약간 벗어나 ... 당신은 또한 확인할 수 있습니다 :

Phil Wright의 답변과 같이 키워드를 적색 색상 등으로 표시하기 위해 색상 레이블을 사용하여 자주 사용하고 있습니다. RichTextBox 컨트롤을 사용하고 테두리를 제거하고 배경색을 SystemColors.control로 설정합니다.

컬러 텍스트를 작성하려면 컨트롤이 먼저 지워진 다음이 기능을 사용하여 색상 텍스트를 추가합니다.

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

이 기능을 "모노"로 실행하려면 모든 색상의 텍스트 전에 공간을 추가하거나 모노가 새로운 색상을 올바르게 설정하지 않습니다. .NET에는 필요하지 않습니다

용법:

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

여러 라벨을 사용하면 간단히 사용할 수 있습니다. 원하는 글꼴 속성을 설정 한 다음 왼쪽을 사용하십시오. 상단 및 너비 특성으로 표시하려는 단어를 다르게 표시합니다. 이것은 Windows 양식을 사용하고 있다고 가정합니다.

이 시도,

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

이것에 대한 기본 지원은 없습니다. 여러 레이블을 사용 하거나이 기능을 제공 할 3 자 컨트롤을 찾아야합니다.

나는 그렇게 생각하지 않습니다. 직접 하나를 만들어야합니다.

귀하의 질문에 따라 귀하의 요구 사항은 간단합니다lable.Text = "This color is Red", 따라서 "색상은"가 파란색이고 "빨간색"이 붉은 색이 될 것입니다. 이것은 이렇게 할 수 있습니다.

lable.Text = "<span style='Color:Blue'>" + " The color is " +"</span>" + "<span style='Color:Red'>"Red"</span>"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top