我正在制作打字程序。我有一个文本文件被读入richtext框。这个文本需要输入,但richtextbox只能容纳这么多行,我希望能够滚动到下一行,以便在尝试过前一行后显示其余的文本。
我已经尝试过textbox.ScrollToCaret(),但它只会使文本框闪烁,就像在向上和向下滚动一样。
我确实记录了索引,但我尝试过的方法并没有奏效。 Hacky等方式(主要测试它):
if(index > 300)
textbox.ScrollToCaret();
300是文本框中当前可见的最大字符数。有没有办法滚动显示文本框中的其余行?如果需要,我很乐意提供更多信息。
wordPreview.BeginUpdate();
wordPreview.SelectionStart = wordPreview.TextLength;
wordPreview.ScrollToCaret();
wordPreview.EndUpdate();
答案 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"/>