2013-10-10 62 views
0

所以我花了大約三天的時間搜索互聯網 - 谷歌,堆棧溢出,微軟的C#文檔 - 並沒有產生有益的結果。我的問題是我最近創建了一個非常靈活和快速的語法突出顯示RichTextBox,它保存在UserControl中。我使用WinForms創建了這個。如何使用RichTextBox突出顯示語法並禁用自動滾動?

然而,儘管我的項目的速度和靈活性,仍然存在一個明顯的和極其令人討厭的故障。這個小故障是我的RichTextBox會自動滾動...所有... The ...時間。我不希望這種自動滾動發生。當我突出顯示文字時,我希望用戶看不到任何移動或過渡,但只能看到彩色字母和符號。這是影響了我的項目的語法高亮代碼:

[DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 


    private void DoHighlight() 
    { 

     if (TextEditor.Text.Length <= 0) 
      return; 

     int visibleStart = TextEditor.GetCharIndexFromPosition(new Point(1, 1)); 
     int visibleEnd = TextEditor.GetCharIndexFromPosition(new Point(1, TextEditor.Height - 1)) + TextEditor.Lines[BottomLine].Length; 
     int[] curSelection = new [] {TextEditor.SelectionStart,TextEditor.SelectionLength}; 

     LineCounter.Focus(); 
     SendMessage(TextEditor.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); 

     TextEditor.SelectAll(); 
     TextEditor.SelectionColor = TextEditor.ForeColor; 

     if (parser != null) 
      parser.HighlightText(this, visibleStart, visibleEnd); 

     TextEditor.SelectionStart = curSelection[0]; 
     TextEditor.SelectionLength = curSelection[1]; 

     SendMessage(TextEditor.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 

     TextEditor.Invalidate(); 

     TextEditor.Focus(); 
    } 

做一些調試和使用許多斷點之後,我確定DoHighlight後自動滾動不會發生,直到()方法已完成,順其自然。

另外,我認爲可能很重要的一點是,只要RichTextBox的文本現在發生更改,就會調用此DoHighlight()方法。

回答

0

在後臺進程中放入DoHighlight()方法。 這樣的:

BackgroundWorker bgw = new BackgroundWorker(); 
    bgw.DoWork += DoHighlight(); 
    bgw.RunWorkerAsync(); 

用這一招,你DoHighlight()方法將並行運行&自動滾動可以發生。

,你也可以在你的DoHighlight使用此代碼()方法:

Application.DoEvents(); 

這將暫停你的方法,並做其他活動,然後返回到你的方法。

+0

「可能發生自動滾動」 但是...我不希望發生自動滾動。那是你的意思嗎?並感謝您的幫助!非常感謝! – NoahWillCrow