2016-04-05 55 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"/>