سؤال

أنا أبحث عن طريقة لعرض ألوان متعددة في تسمية C#/.NET واحدة.على سبيل المثال، تعرض التسمية سلسلة من القيم المنفصلة بتنسيق CSV والتي يأخذ كل منها لونًا اعتمادًا على المجموعة التي تقع فيها.أفضل عدم استخدام تسميات متعددة، حيث أن القيم متغيرة الطول ولا أريد اللعب بالتخطيطات الديناميكية.هل هناك دعم محلي لهذا؟

هل كانت مفيدة؟

المحلول

وليس هناك سيطرة الأم في. NET أن يفعل هذا. أفضل رهان هو لكتابة UserControl الخاص بك الخاصة (يطلق عليه RainbowLabel أو شيء). وعادة ما يكون لها يرث مخصصة تحكم تسمية مباشرة من التسمية، ولكن لأنك لا تستطيع الحصول على نص متعدد الألوان في تسمية واحدة، هل ترث فقط من UserControl.

لجعل النص، يمكن أن UserControl الخاص بك تقسيم النص على الفواصل ثم تحميل تسمية مختلف اللون لكل جزء حيوي. وهناك طريقة أفضل، ومع ذلك، سيكون في جعل النص مباشرة على UserControl الخاص بك باستخدام أساليب الرباط وMeasureString في مساحة الاسم الرسومات.

وUserControls الكتابة في. NET في الحقيقة ليست صعبة، وهذا النوع من مشكلة غير عادية هو بالضبط ما هي UserControls مخصصة ل.

على تحديث : في هنا طريقة بسيطة يمكنك استخدامها لجعل النص متعددة الألوان على 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 استخدام العوامات، لذلك عليك الحصول على أخطاء خارج، من قبل بكسل هنا وهناك.

على تحديث : في نسيت حول استخدام TextRenderer. ومن الكلب البطيء.

نصائح أخرى

هل يمكن أن حاول استخدام RichTextBox بحيث يمكنك الحصول على ألوان متعددة لسلسلة ثم جعله للقراءة فقط وإزالة الحدود. تغيير لون الخلفية لنفس النموذج كان على وكنت قد تفلت من العقاب.

وكبديل لذلك، يمكن القيام بذلك كما الخانات أو HTML في عنصر تحكم مناسبة (مثل WebBrowser). ومن المحتمل أن يستغرق أكثر قليلا الموارد التي كنت مثاليا مثل، لكنه سوف يعمل بسرعة إلى حد ما.

إذا كنت بناء التطبيق ويندوز الخاص بك لذوي XP فما فوق، يمكنك استخدام برنامج الأغذية العالمي. حتى لو كان Windows نماذج التطبيق، يمكنك إضافة WPF UserControl.

وأود أن ثم استخدام التسمية، وتعيين "المقدمة" الملكية أن تكون متدرجة من الألوان.

وأو في نماذج Windows (لا WPF)، هل يمكن أن مجرد استخدام "لوحة التدفق"، ومن ثم في لحلقة إضافة تسميات متعددة كما شرائح sentense بك ... انهم سوف جميع "تدفق" معا كما لو أنها كان واحدا التسمية.

خارج الموضوع قليلا ...يمكنك التحقق أيضا:

وأنا باستخدام الملصقات الملونة في كثير من الأحيان للاحتفال الكلمات الرئيسية في اللون الأحمر الخ كما هو الحال في الجواب فيل رايت يمكنني استخدام عنصر تحكم 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();
    }

إذا كنت ترغب في تشغيل هذه الوظيفة مع "أحادية" ثم إضافة مسافة قبل كل نص ملون جديد، أو سوف أحادية لم يتم تغيير لون جديد بشكل صحيح. هذا غير مطلوب مع صافي

والاستعمال:

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

ويمكنك ببساطة استخدام تسميات متعددة. تعيين خصائص الخط الذي تريده ومن ثم استخدام اليسار. أعلى وعرض خصائص لعرض الكلمات التي تريد عرضها بشكل مختلف. هذا على افتراض أنك تستخدم أشكال النوافذ.

وجرب هذا،

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

وليس هناك دعم أصلي لذلك؛ سوف إما أن استخدام تسميات متعددة أو العثور على ضبط 3rd الطرف من شأنها أن توفر هذه الوظيفة.

وأنا لا أعتقد ذلك. يجب عليك إنشاء واحد نفسك.

وكما في سؤالك الشرط الخاص بك هو بسيط مثل 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