चयन छिपा हुआ नहीं है, तो RichTextBox नियंत्रण स्वचालित रूप से वर्तमान चयन पर स्क्रॉल करता है। RichTextBox.AppendText(), टेक्स्ट जोड़ने के अलावा, वर्तमान चयन को भी संशोधित करता है, और इसलिए अप्रत्यक्ष रूप से "ऑटोस्कोलिंग" व्यवहार को ट्रिगर करता है। ध्यान दें कि यदि RichTextBox.HideSelection सत्य पर सेट है, तो नियंत्रण फोकस में नहीं होने पर चयन छुपाया जाएगा; यह आपके द्वारा वर्णित व्यवहार को बताता है, जहां स्वत: स्क्रॉलिंग तब होती है जब उपयोगकर्ता नियंत्रण में क्लिक करता है। इसे रोकने के लिए (जिससे यह ध्यान केंद्रित देने) , आप जब पाठ जोड़कर निम्नलिखित कार्य करने होंगे:
- बैकअप प्रारंभिक चयन
- Unfocus नियंत्रण
- छिपाएं चयन (एक Windows संदेश के माध्यम से)
- AppendText
- प्रारंभिक चयन पुनर्स्थापित
- सामने लाएँ चयन
- Refocus नियंत्रण
आप यह भी जांचना चाहेंगे कि चयन पहले से ही पाठ के अंत में है या नहीं, और यदि यह है तो ऑटोस्कोलिंग व्यवहार की अनुमति दें - यह अनिवार्य रूप से विजुअल स्टूडियो की आउटपुट विंडो के व्यवहार को अनुकरण करता है। उदाहरण के लिए:
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
const int WM_USER = 0x400;
const int EM_HIDESELECTION = WM_USER + 63;
void OnAppend(string text)
{
bool focused = richTextBox1.Focused;
//backup initial selection
int selection = richTextBox1.SelectionStart;
int length = richTextBox1.SelectionLength;
//allow autoscroll if selection is at end of text
bool autoscroll = (selection==richTextBox1.Text.Length);
if (!autoscroll)
{
//shift focus from RichTextBox to some other control
if (focused) textBox1.Focus();
//hide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 1, 0);
}
richTextBox1.AppendText(text);
if (!autoscroll)
{
//restore initial selection
richTextBox1.SelectionStart = selection;
richTextBox1.SelectionLength = length;
//unhide selection
SendMessage(richTextBox1.Handle, EM_HIDESELECTION, 0, 0);
//restore focus to RichTextBox
if(focused) richTextBox1.Focus();
}
}
आपका समाधान एक आकर्षण की तरह काम करता है! मैंने अपने RichTextBox को स्वरूपण परिवर्तन करने के बाद स्क्रॉल करने से रोकने के लिए कई अन्य दृष्टिकोणों की कोशिश की, और यह काम करने वाला एकमात्र ऐसा था। यह पहली बार घुल गया, लेकिन यह काम किया :) –