2009-03-09 14 views
9

में ऑटोस्कोलिंग रोकें मेरे पास एक रीडोनक्स्टबॉक्स लॉगिंग विंडो है जिसे मैंने RichTextBox नियंत्रण का उपयोग करके कार्यान्वित किया है। मैं स्वत: स्क्रॉलिंग को अक्षम करने में सक्षम होना चाहता हूं जो तब होता है जब उपयोगकर्ता नियंत्रण में क्लिक करता है ताकि उपयोगकर्ता कॉपी/पेस्ट ऑपरेशंस या जो भी हो, के लिए एक विशिष्ट लॉग का चयन कर सके। हालांकि, जैसे ही उपयोगकर्ता RichTextBox में क्लिक करता है, यह स्वचालित रूप से नीचे तक स्क्रॉल करता है, जिससे यह मुश्किल हो जाता है।RichTextBox

कोई भी इस व्यवहार को ओवरराइड करने का तरीका जानता है?

धन्यवाद!

उत्तर

6

आप कुछ इस तरह कर रही है पर एक नज़र हो सकता है:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private static extern IntPtr LockWindowUpdate(IntPtr Handle); 
फिर अपने विधि में

कि लॉग डेटा संलग्न कर देता है (मैं कुछ मान्यताओं यहाँ बना रही हूँ) आप कुछ इस तरह कर सकते हैं:

LockWindowUpdate(this.Handle); 
int pos = richTextBox1.SelectionStart; 
int len = richTextBox1.SelectionLength; 
richTextBox1.AppendText(yourText); 
richTextBox1.SelectionStart = pos; 
richTextBox1.SelectionLength = len; 
LockWindowUpdate(IntPtr.Zero); 

मैंने एक टाइमर के साथ एक छोटा परीक्षण ऐप किया जिसने समृद्ध टेक्स्टबॉक्स पर संलग्न किया और इसे स्क्रॉलिंग से रोक दिया ताकि मैं टेक्स्ट चयन कर सकूं। इसमें कुछ स्थितिगत मुद्दे हैं और यह सही नहीं है, लेकिन शायद यह आपको स्वयं के समाधान की ओर ले जाने में मदद करेगा।

सभी बेहतरीन!

11

चयन छिपा हुआ नहीं है, तो RichTextBox नियंत्रण स्वचालित रूप से वर्तमान चयन पर स्क्रॉल करता है। RichTextBox.AppendText(), टेक्स्ट जोड़ने के अलावा, वर्तमान चयन को भी संशोधित करता है, और इसलिए अप्रत्यक्ष रूप से "ऑटोस्कोलिंग" व्यवहार को ट्रिगर करता है। ध्यान दें कि यदि RichTextBox.HideSelection सत्य पर सेट है, तो नियंत्रण फोकस में नहीं होने पर चयन छुपाया जाएगा; यह आपके द्वारा वर्णित व्यवहार को बताता है, जहां स्वत: स्क्रॉलिंग तब होती है जब उपयोगकर्ता नियंत्रण में क्लिक करता है। इसे रोकने के लिए (जिससे यह ध्यान केंद्रित देने) , आप जब पाठ जोड़कर निम्नलिखित कार्य करने होंगे:

  1. बैकअप प्रारंभिक चयन
  2. Unfocus नियंत्रण
  3. छिपाएं चयन (एक Windows संदेश के माध्यम से)
  4. AppendText
  5. प्रारंभिक चयन पुनर्स्थापित
  6. सामने लाएँ चयन
  7. 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(); 
     } 
    } 
+0

आपका समाधान एक आकर्षण की तरह काम करता है! मैंने अपने RichTextBox को स्वरूपण परिवर्तन करने के बाद स्क्रॉल करने से रोकने के लिए कई अन्य दृष्टिकोणों की कोशिश की, और यह काम करने वाला एकमात्र ऐसा था। यह पहली बार घुल गया, लेकिन यह काम किया :) –

0

SytS समाधान एक मुद्दा है, जब कुछ पाठ "संलग्न" है, स्क्रॉल पट्टी चाल ऐसी है कि चयन पैनल के शीर्ष करने के लिए जाना है।

[System.Runtime.InteropServices.DllImport("User32.dll")] 
    extern static int GetScrollPos(IntPtr hWnd, int nBar); 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); 

This solution मेरे लिए और अधिक पूरा हो गया है: एक समाधान बचाने/साथ स्क्रॉल स्थिति बहाल करने के लिए है।

संबंधित मुद्दे