একটি রিচটেক্সটবক্স স্ট্রিংয়ের বিভিন্ন অংশ রঙ করুন


109

আমি রিচটেক্সটবক্সে যুক্ত করার জন্য স্ট্রিংয়ের কিছু অংশ রঙ করার চেষ্টা করছি। আমার কাছে বিভিন্ন স্ট্রিং থেকে তৈরি একটি স্ট্রিং রয়েছে।

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

বার্তাটি তৈরি হয়ে গেলে এটি দেখতে দেখতে এটিই মনে হয়।

[৯:২৩ পিএম] ব্যবহারকারী: আমার বার্তা এখানে।

আমি বন্ধনীগুলির মধ্যে এবং এর সাথে সমস্ত কিছু [9:23] একটি রঙ হতে চাই, 'ব্যবহারকারীর' অন্য রঙ হতে এবং বার্তাটি অন্য রঙ হতে চাই। তারপরে আমি আমার রিচটেক্সটবক্সে স্ট্রিং যুক্ত করতে চাই।

আমি কীভাবে এটি সম্পাদন করতে পারি?



5
আমি অনুসন্ধান করেছি এবং আমি এর কোনওটিই কার্যকর খুঁজে পাইনি।
ফ্যাটাল 510

এই সহজ সমাধানের জন্য ধন্যবাদ, আমার জন্য ভাল কাজ করে। প্রতিবার আপনি পাঠ্য সংযোজন করতে চাইলে অ্যাপেনডেক্সট (...) ব্যবহার করতে ভুলবেন না এবং '+ =' অপারেটর বা প্রয়োগিত রঙগুলি ব্যবহার না করে বাতিল করা হয়।
Xhis

উত্তর:


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

মনে রাখবেন যে আপনি প্রচুর বার্তা আউটপুট দিচ্ছেন তবে আপনি কিছু ঝলকানি লক্ষ্য করতে পারেন। রিচটেক্সটবক্স ফ্লিকার কীভাবে হ্রাস করতে হয় তার ধারণার জন্য এই সি # কর্নার নিবন্ধটি দেখুন ।


3
এ নিয়ে আমার কিছুটা সমস্যা হয়েছিল। আমি অন্য জায়গায় ব্যবহার করেছি box.Text += mystringএবং তাই সমস্ত রঙ অদৃশ্য হয়ে গেছে। আমি যখন box.AppendText(mystring)এটির সাথে প্রতিস্থাপন করেছি , এটি একটি মনোমুগ্ধকর মত কাজ করে।
নেত্রিয়াম

3
কোডটি অন্য কিছু রঙে স্ট্রিং যুক্ত করার সাথে রঙ বিচ্ছুরিত হওয়ার সাথে আমার কিছুটা সমস্যা রয়েছে only কেবলমাত্র পার্থক্য হ'ল আমি পূর্ববর্তী তৈরি রিয়েলটেক্সটবক্সে ভের বক্সটি বরাদ্দ করছি ....
manu_dilip_shah

আমি কী ভুল করছি ... "সিলেকশনস্টার্ট" কোনও রিচটেক্সটবক্সের সম্পত্তি নয় (বা আমি এটি কমপক্ষে অ্যাক্সেস করতে পারি না)? আমি "নির্বাচন" খুঁজে পেয়েছি তবে এটি একমাত্র প্রাপ্তি সম্পত্তি ...
00jt

2
এটি বিশেষত উইনফোর্ডসের জন্য। আপনি কি কোনও সুযোগেই ডাব্লুপিএফ ব্যবহার করছেন?
নাথান বাউলচ

আমার এটির কোনও ওভারলোড নেই, কেবল AppendText(string text)
উইনফর্মগুলি

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

এটি আমার কোডে রুপান্তরিত সংস্করণ (আমি ব্যবহার করছি। নেট ৪.৫) তবে আমার মনে হয় এটিও 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();
}

মূলটির সাথে পার্থক্য:

  • কোনও নতুন লাইনে পাঠ্য যুক্ত করার বা এটি কেবল সংযোজন করার সম্ভাবনা
  • নির্বাচন পরিবর্তন করার দরকার নেই, এটি একই কাজ করে
  • অটস্ক্রোল জোর করতে স্ক্রোলটোক্রেট .োকানো
  • লেআউট কল স্থগিত / পুনরায় শুরু

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

এমএসডিএন থেকে :

ব্লক সম্পত্তি হ'ল রিচটেক্সটবক্সের সামগ্রী সামগ্রী। এটি অনুচ্ছেদে উপাদানগুলির একটি সংগ্রহ। প্রতিটি অনুচ্ছেদে উপাদানগুলিতে নিম্নলিখিত উপাদানগুলি থাকতে পারে:

  • সঙ্গতিপূর্ণভাবে

  • InlineUIContainer

  • চালান

  • বিঘত

  • সাহসী

  • হাইপারলিঙ্ক

  • ইট্যালির

  • নিম্নরেখাঙ্কন

  • লাইন বিরতি

সুতরাং আমি মনে করি পার্টস রঙের উপর নির্ভর করে আপনার স্ট্রিংটি বিভক্ত করতে হবে এবং Runপ্রয়োজন হিসাবে অনেকগুলি বস্তু তৈরি করতে হবে।


আমি আশা করছিলাম যে এটিই আমি উত্তরটি সত্যিই খুঁজছিলাম তবে এটি একটি ডাব্লুপিএফ উত্তর বলে মনে হচ্ছে, উইনফোর্ডস উত্তর নয়।
ক্রিস্টেন হাম্মাক

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

ডাব্লুপিএফ ব্যবহার করা ভাল; এই সমাধানটি নিখুঁত নয়, তবে উইনফর্মের জন্য এটি কাজ করে।


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- এ সিলেকশন ব্যবহার করে, বেশ কয়েকটি অন্যান্য উত্তর থেকে একত্রিত হয়ে, অন্য কোনও কোডের প্রয়োজন নেই (Severity enum এবং GetSeverityColor ফাংশন ব্যতীত)

 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

ইন্টারনেটে গবেষণা করার পরে আমি এই ফাংশনটি তৈরি করেছি যেহেতু আপনি যখন কোনও ডাটা গ্রিড ভিউ থেকে একটি সারি নির্বাচন করেন তখন আমি একটি এক্সএমএল স্ট্রিং মুদ্রণ করতে চেয়েছিলাম।

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

এটি প্রদত্ত সমস্যা সমাধান করে না, কেবল সমাধানটি কীভাবে কাজ করবে তা চিত্রিত করে।
জোসেফ ব্লাহা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.