文本框滚动到下一行

时间:2016-04-05 18:37:38

标签: c# wpf xaml text scroll

我正在制作打字程序。我有一个文本文件被读入richtext框。这个文本需要输入,但richtextbox只能容纳这么多行,我希望能够滚动到下一行,以便在尝试过前一行后显示其余的文本。

我已经尝试过textbox.ScrollToCaret(),但它只会使文本框闪烁,就像在向上和向下滚动一样。

我确实记录了索引,但我尝试过的方法并没有奏效。 Hacky等方式(主要测试它):

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

300是文本框中当前可见的最大字符数。有没有办法滚动显示文本框中的其余行?如果需要,我很乐意提供更多信息。

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

使用TextBlock Control而不是文本框控件,并使用TextBlock的TextWrapping属性。

<TextBlock TextWrapping="Wrap"/>