एक RichTextBox स्ट्रिंग के विभिन्न भागों को रंग दें


109

मैं एक स्ट्रिंग के कुछ हिस्सों को कलर करने की कोशिश कर रहा हूं जो कि एक रिचटेक्स्टबॉक्स में जोड़ा जा सकता है। मेरे पास अलग-अलग तारों से निर्मित एक स्ट्रिंग है।

string temp = "[" + DateTime.Now.ToShortTimeString() + "] " +
              userid + " " + message + Environment.NewLine;

इसके निर्माण के बाद यह संदेश कैसा दिखेगा।

[९: २३ बजे] उपयोगकर्ता: मेरा संदेश यहाँ।

मैं चाहता हूं कि कोष्ठक [9:23] के भीतर और एक रंग के लिए सब कुछ हो, 'उपयोगकर्ता' एक और रंग हो और संदेश दूसरे रंग का हो। फिर मैं चाहूंगा कि स्ट्रिंग मेरे रिचटेक्स्टबॉक्स में संलग्न हो।

मैं यह कैसे हासिल कर सकता हूं?



5
मैंने खोज की और मुझे इसमें से कोई भी उपयोगी नहीं मिला।
फेटल 510

इस सरल समाधान के लिए धन्यवाद, मेरे लिए ठीक काम करता है। हर बार जब आप टेक्स्ट जोड़ना चाहते हैं, तो एपेंडटेक्स्ट (...) का उपयोग करना न भूलें, और '+ =' ऑपरेटर या लागू रंगों का उपयोग न करें।
यह

जवाबों:


238

यहाँ एक विस्तार विधि है जो AppendTextरंग पैरामीटर के साथ विधि को ओवरलोड करती है :

public static class RichTextBoxExtensions
{
    public static void AppendText(this RichTextBox box, string text, Color color)
    {
        box.SelectionStart = box.TextLength;
        box.SelectionLength = 0;

        box.SelectionColor = color;
        box.AppendText(text);
        box.SelectionColor = box.ForeColor;
    }
}

और यह है कि आप इसका उपयोग कैसे करेंगे:

var userid = "USER0001";
var message = "Access denied";
var box = new RichTextBox
              {
                  Dock = DockStyle.Fill,
                  Font = new Font("Courier New", 10)
              };

box.AppendText("[" + DateTime.Now.ToShortTimeString() + "]", Color.Red);
box.AppendText(" ");
box.AppendText(userid, Color.Green);
box.AppendText(": ");
box.AppendText(message, Color.Blue);
box.AppendText(Environment.NewLine);

new Form {Controls = {box}}.ShowDialog();

ध्यान दें कि यदि आप बहुत सारे संदेशों का उत्पादन कर रहे हैं, तो आप कुछ टिमटिमाते हुए देख सकते हैं। RichTextBox झिलमिलाहट को कम करने के बारे में विचारों के लिए यह C # कॉर्नर लेख देखें ।


3
मुझे इससे थोड़ी परेशानी हुई। मैंने दूसरी जगह इस्तेमाल किया box.Text += mystringऔर इसलिए सारे रंग गायब हो गए। जब मैंने इसे बदल दिया box.AppendText(mystring), तो इसने एक आकर्षण की तरह काम किया।
नट्रियम

3
मुझे कोड के साथ कुछ परेशानी है कि रंग किसी अन्य रंग में स्ट्रिंग जोड़ने पर फैलता है। केवल अंतर यह है कि मैं पहले से बनाए गए
रिचटेक्स्टबॉक्स

मैं क्या गलत कर रहा हूं ... "SelectionStart" एक RichTextBox की संपत्ति नहीं है (या मैं इसे कम से कम एक्सेस नहीं कर सकता)? मुझे "चयन" मिला, लेकिन यह केवल एक संपत्ति है ...
00jt

2
यह विशेष रूप से WinForms के लिए है। क्या आप किसी भी संयोग से WPF का उपयोग कर रहे हैं?
नाथन बॉल

मेरे पास कोई ओवरलोड नहीं है, केवल AppendText(string text)WinForms के साथ
vaso123

12

मैंने एक पैरामीटर के रूप में फ़ॉन्ट के साथ विधि का विस्तार किया है:

public static void AppendText(this RichTextBox box, string text, Color color, Font font)
{
    box.SelectionStart = box.TextLength;
    box.SelectionLength = 0;

    box.SelectionColor = color;
    box.SelectionFont = font;
    box.AppendText(text);
    box.SelectionColor = box.ForeColor;
}

नोट - यह काम करने के लिए आपको परिशिष्ट विधि का उपयोग करना चाहिए। बॉक्स की टेक्स्ट प्रॉपर्टी को कुछ भी असाइन करने से वह टूट जाएगा।
जेफ

9

यह संशोधित संस्करण है जो मैंने अपने कोड में डाला है (मैं .net 4.5 का उपयोग कर रहा हूं) लेकिन मुझे लगता है कि इसे 4.0 पर भी काम करना चाहिए।

public void AppendText(string text, Color color, bool addNewLine = false)
{
        box.SuspendLayout();
        box.SelectionColor = color;
        box.AppendText(addNewLine
            ? $"{text}{Environment.NewLine}"
            : text);
        box.ScrollToCaret();
        box.ResumeLayout();
}

मूल एक के साथ अंतर:

  • एक नई पंक्ति में पाठ जोड़ने की संभावना या बस इसे संलग्न करें
  • चयन को बदलने की आवश्यकता नहीं है, यह एक ही काम करता है
  • Autoscroll को मजबूर करने के लिए ScrollToCaret डाला
  • जोड़ा निलंबित / फिर से शुरू लेआउट कॉल

6

मुझे लगता है कि एक रिच टेक्स्ट बॉक्स में "चयनित पाठ" को संशोधित करना रंगीन पाठ जोड़ने का सही तरीका नहीं है। तो यहाँ एक "रंग ब्लॉक" जोड़ने की विधि है:

        Run run = new Run("This is my text");
        run.Foreground = new SolidColorBrush(Colors.Red); // My Color
        Paragraph paragraph = new Paragraph(run);
        MyRichTextBlock.Document.Blocks.Add(paragraph);

से MSDN :

ब्लॉक की संपत्ति RichTextBox की सामग्री संपत्ति है। यह पैराग्राफ तत्वों का एक संग्रह है। प्रत्येक अनुच्छेद तत्व में सामग्री में निम्नलिखित तत्व हो सकते हैं:

  • पंक्ति में

  • InlineUIContainer

  • Daud

  • स्पैन

  • साहसिक

  • हाइपरलिंक

  • तिरछा

  • रेखांकन

  • रेखा अवरोध

इसलिए मुझे लगता है कि आपको अपने स्ट्रिंग को भागों के रंग के आधार पर विभाजित करना होगा, और Runआवश्यकतानुसार कई ऑब्जेक्ट्स बनाने होंगे ।


मैं उम्मीद कर रहा था कि यह वह उत्तर था जिसकी मैं वास्तव में तलाश कर रहा था, लेकिन यह एक WPF उत्तर और WinForms उत्तर नहीं प्रतीत होता है।
क्रिस्टन हैमैक

3

यह मेरे लिए काम है! मुझे आशा है कि यह आपके लिए उपयोगी होगा!

public static RichTextBox RichTextBoxChangeWordColor(ref RichTextBox rtb, string startWord, string endWord, Color color)
{
    rtb.SuspendLayout();
    Point scroll = rtb.AutoScrollOffset;
    int slct = rtb.SelectionIndent;
    int ss = rtb.SelectionStart;
    List<Point> ls = GetAllWordsIndecesBetween(rtb.Text, startWord, endWord, true);
    foreach (var item in ls)
    {
        rtb.SelectionStart = item.X;
        rtb.SelectionLength = item.Y - item.X;
        rtb.SelectionColor = color;
    }
    rtb.SelectionStart = ss;
    rtb.SelectionIndent = slct;
    rtb.AutoScrollOffset = scroll;
    rtb.ResumeLayout(true);
    return rtb;
}

public static List<Point> GetAllWordsIndecesBetween(string intoText, string fromThis, string toThis,bool withSigns = true)
{
    List<Point> result = new List<Point>();
    Stack<int> stack = new Stack<int>();
    bool start = false;
    for (int i = 0; i < intoText.Length; i++)
    {
        string ssubstr = intoText.Substring(i);
        if (ssubstr.StartsWith(fromThis) && ((fromThis == toThis && !start) || !ssubstr.StartsWith(toThis)))
        {
            if (!withSigns) i += fromThis.Length;
            start = true;
            stack.Push(i);
        }
        else if (ssubstr.StartsWith(toThis) )
        {
            if (withSigns) i += toThis.Length;
            start = false;
            if (stack.Count > 0)
            {
                int startindex = stack.Pop();
                result.Add(new Point(startindex,i));
            }
        }
    }
    return result;
}

0

किसी के कहे अनुसार पाठ का चयन, चयन क्षण भर में हो सकता है। में Windows Forms applicationsवहाँ समस्या के लिए कोई अन्य समाधान है, लेकिन आज मैं एक बुरा पाया, काम करने, हल करने के लिए जिस तरह से: यदि आप एक डाल सकते हैं PictureBoxकरने के लिए ओवरलैपिंग में RichtextBoxअगर उसका स्क्रीनशॉट, चयन के दौरान और बदलते रंग या फ़ॉन्ट के साथ, के बाद यह कर रही है ऑपरेशन पूरा होने पर, फिर से प्रकट करें।

कोड यहाँ है ...

//The PictureBox has to be invisible before this, at creation
//tb variable is your RichTextBox
//inputPreview variable is your PictureBox
using (Graphics g = inputPreview.CreateGraphics())
{
    Point loc = tb.PointToScreen(new Point(0, 0));
    g.CopyFromScreen(loc, loc, tb.Size);
    Point pt = tb.GetPositionFromCharIndex(tb.TextLength);
    g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(pt.X, 0, 100, tb.Height));
}
inputPreview.Invalidate();
inputPreview.Show();
//Your code here (example: tb.Select(...); tb.SelectionColor = ...;)
inputPreview.Hide();

WPF का उपयोग करना बेहतर है; यह समाधान सही नहीं है, लेकिन Winform के लिए यह काम करता है।


0
private void Log(string s , Color? c = null)
        {
            richTextBox.SelectionStart = richTextBox.TextLength;
            richTextBox.SelectionLength = 0;
            richTextBox.SelectionColor = c ?? Color.Black;
            richTextBox.AppendText((richTextBox.Lines.Count() == 0 ? "" : Environment.NewLine) + DateTime.Now + "\t" + s);
            richTextBox.SelectionColor = Color.Black;

        }

0

WPF में चयन का उपयोग करना, कई अन्य उत्तरों से एकत्र करना, किसी अन्य कोड की आवश्यकता नहीं है (गंभीरता ईनोम और गेट्सवैलिटेरी फंक्शन को छोड़कर)

 public void Log(string msg, Severity severity = Severity.Info)
    {
        string ts = "[" + DateTime.Now.ToString("HH:mm:ss") + "] ";
        string msg2 = ts + msg + "\n";
        richTextBox.AppendText(msg2);

        if (severity > Severity.Info)
        {
            int nlcount = msg2.ToCharArray().Count(a => a == '\n');
            int len = msg2.Length + 3 * (nlcount)+2; //newlines are longer, this formula works fine
            TextPointer myTextPointer1 = richTextBox.Document.ContentEnd.GetPositionAtOffset(-len);
            TextPointer myTextPointer2 = richTextBox.Document.ContentEnd.GetPositionAtOffset(-1);

            richTextBox.Selection.Select(myTextPointer1,myTextPointer2);
            SolidColorBrush scb = new SolidColorBrush(GetSeverityColor(severity));
            richTextBox.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, scb);

        }

        richTextBox.ScrollToEnd();
    }

0

मैंने इंटरनेट पर शोध करने के बाद यह फ़ंक्शन बनाया क्योंकि जब आप डेटा ग्रिड दृश्य से एक पंक्ति का चयन करते हैं तो मैं एक XML स्ट्रिंग प्रिंट करना चाहता था।

static void HighlightPhrase(RichTextBox box, string StartTag, string EndTag, string ControlTag, Color color1, Color color2)
{
    int pos = box.SelectionStart;
    string s = box.Text;
    for (int ix = 0; ; )
    {
        int jx = s.IndexOf(StartTag, ix, StringComparison.CurrentCultureIgnoreCase);
        if (jx < 0) break;
        int ex = s.IndexOf(EndTag, ix, StringComparison.CurrentCultureIgnoreCase);
        box.SelectionStart = jx;
        box.SelectionLength = ex - jx + 1;
        box.SelectionColor = color1;
        
        int bx = s.IndexOf(ControlTag, ix, StringComparison.CurrentCultureIgnoreCase);
        int bxtest = s.IndexOf(StartTag, (ex + 1), StringComparison.CurrentCultureIgnoreCase);
        if (bx == bxtest)
        {
            box.SelectionStart = ex + 1;
            box.SelectionLength = bx - ex + 1;
            box.SelectionColor = color2;
        }
        
        ix = ex + 1;
    }
    box.SelectionStart = pos;
    box.SelectionLength = 0;
}

और आप इसे कहते हैं

   HighlightPhrase(richTextBox1, "<", ">","</", Color.Red, Color.Black);

यह दी गई समस्या को हल नहीं करता है, केवल यह बताता है कि समाधान कैसे काम कर सकता है।
जोसेफ ब्लाहा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.