【问题标题】:Disabling RichTextBox autoscroll禁用 RichTextBox 自动滚动
【发布时间】:2011-06-22 15:24:10
【问题描述】:

我正在使用 RichTextBox 控件来显示应用程序日志。我通过调用 RichTextBox::AppendText 方法每秒更新一次控件。对我来说真正烦人的是光标一直滚动到最后一行文本。当用户需要分析一开始的日志时,它非常不舒服。我尝试了以下解决方案:

int pos = tb_logs.SelectionStart;
tb_logs.AppendText("log message");
tb_logs.SelectionStart = pos;

这并没有触及问题的核心,因为控制会定期重绘,这非常分散注意力。有更清洁的解决方案吗?

【问题讨论】:

  • 这听起来有点奇怪,因为到最后应该明确地在某个地方完成。您确定附加代码不会将选择设置为结尾吗?
  • 不,只是 AppendText("text"), AppendText("\t"), Appendtext("\n")
  • 我发现了有趣的事情。仅当文本区域具有焦点时才会发生自动滚动。单击文本区域后出现问题。如果我不点击它,我可以在添加新消息的同时使用滚动条滚动消息并且文本不会跳转。
  • 参见Prevent AutoScrolling in C# RichTextBox,它描述了同样的问题。

标签: c# richtextbox refresh autoscroll


【解决方案1】:

如果您的问题是在添加日志文本时“垂直滚动”向下滚动,但您希望它始终位于顶部:

您必须将事件处理程序添加到 VScroll、TextChanged 事件并在事件处理程序中将滚动设置为顶部

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll;
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll;

private const UInt32 SB_TOP = 0x6;
private const UInt32 WM_VSCROLL = 0x115;

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg,
    IntPtr wParam, IntPtr lParam);

private void HandleRichTextBoxAdjustScroll(Object sender,
    EventArgs e)
{
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero);
}

你也可以对水平滚动条做同样的事情。将 WM_VSCROLL 替换为 WM_HSCROLL 并将 SB_TOP 替换为 SB_LEFT

private const UInt32 WM_HSCROLL = 0x0114;
private const UInt32 SB_LEFT = 0x06;

【讨论】:

    【解决方案2】:

    你可以试试 tb_logs.SelectionLength = 1;连同选择开始。这将从您的当前位置中选择 1 个字符。

    没试过……但可能有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多