2016-04-05 83 views
1

我目前正在打字程序。我有一個文本文件被讀入一個富文本框。這個文本是需要輸入的內容,但是richtextbox只能適合這麼多行,我希望能夠滾動到下一行來顯示其他文本,一旦前面的行已經被嘗試。文本框滾動到下一行

我試過textbox.ScrollToCaret(),但它所做的只是讓文本框閃爍,就像在向上和向下滾動一樣。

我確實記錄了索引,但我嘗試過的方式沒有奏效。 Hacky方式如(主要測試出來):

if(index > 300) 
    textbox.ScrollToCaret(); 

300是文本框中當前可見的最大字符數。有什麼方法可以滾動顯示文本框中的其餘行嗎?如果需要,我很樂意提供更多信息。

  wordPreview.BeginUpdate();         
      wordPreview.SelectionStart = wordPreview.TextLength; 
      wordPreview.ScrollToCaret(); 
      wordPreview.EndUpdate(); 
+0

你能上的文本改變事件試試ScrollToCaret() - 這樣的:http://stackoverflow.com/questions/9416608/rich-text-box-scroll-to-the-bottom-when-新數據寫入它 –

+0

@DavidOesterreich這是我嘗試的,但我改變了選擇開始爲0,因爲我不能訪問TextChanged中的索引,並將其設置爲文本長度只能自動滾動到結尾當開始時。它主要閃爍,好像當它需要滾動時試圖滾動,而當它需要滾動時,它不會滾動。 – Jed5931

+0

- 編輯:道歉,只是再次測試。 TextLength自動顯示行的末尾,但是當有輸入時,它會從最後一行閃爍到第一行。 – Jed5931

回答

0

要儘量擺脫在RichTextBox的閃爍,可以擴展RichTextBox類並添加的BeginUpdate和EndUpdate方法

擴展類:

public static class MyExtensions 
    { 


     private const int WM_USER = 0x0400; 
     private const int EM_SETEVENTMASK = (WM_USER + 69); 
     private const int WM_SETREDRAW = 0x0b; 
     private static IntPtr OldEventMask; 

     [DllImport("user32.dll", CharSet = CharSet.Auto)] 
     private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

     public static void BeginUpdate(this RichTextBox rtb) 
     { 
      SendMessage(rtb.Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero); 
      OldEventMask = (IntPtr)SendMessage(rtb.Handle, EM_SETEVENTMASK, IntPtr.Zero, IntPtr.Zero); 
     } 

     public static void EndUpdate(this RichTextBox rtb) 
     { 
      SendMessage(rtb.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
      SendMessage(rtb.Handle, EM_SETEVENTMASK, IntPtr.Zero, OldEventMask); 
     }  
    } 

然後在文本改變事件,當每個richtextbox正在更新或滾動時,您都可以調用BeginUpdate和EndUpdate。

richTextBox1.BeginUpdate(); 

    richTextBox1.EndUpdate(); 
+0

我已經添加了類,並在我的TextChanged事件中(編輯了上面的帖子),它仍然閃爍。 – Jed5931

+0

它仍然上下滾動,仍然找不到修復程序? – Jed5931

0

使用TextBlock控件代替文本框控件並使用TextBlock的TextWrapping屬性。

<TextBlock TextWrapping="Wrap"/>