【问题标题】:Controlling horizontal scroll in RichTextBox控制 RichTextBox 中的水平滚动
【发布时间】:2009-11-24 18:37:20
【问题描述】:

我有一个 RichTextBox,我正在向其中发送日志信息,但 RichTextBox 似乎想要在附加的文本太长而无法容纳时水平滚动。

经过广泛搜索,并反复以ScrollToCaret() 失败,似乎此函数控制垂直滚动位置,而不是水平滚动位置。我还尝试使用 API 调用 GetScrollRange()SetScrollPos(),虽然它们确实将滚动条放置在正确的位置,但它们并没有控制 RichTextBox 滚动的实际位置。

【问题讨论】:

    标签: c# winforms richtextbox


    【解决方案1】:

    会不会是日志中每条日志信息的末尾都没有换行呢?使用 System.Environment.Newline 附加到每行的末尾,然后再将其放入richtextbox。看看 CodeProject 上的这个article,它可能会对您有所帮助并让您朝着正确的方向前进。

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 最初,当我附加文本时,我正在执行 Environment.NewLine + 文本。我把它换了,现在 ScrollToCaret() 就可以了。当然,这并不像我想要的那样优雅(RTB 底部的额外行真的让我很困扰),但无需担心导入任何内容。谢谢!
    【解决方案2】:

    这有点乱,但应该可以: 当您执行 ScrollToCaret 并且水平滚动位置发生更改时,它会触发 HScroll 事件。如果您不希望发生 HScroll 事件,您可以将水平滚动条向后移动 1.将selectionstart移动到前一个crlf之后1个字符 2.将 selectionstart 设置为该位置,然后 3. ScrollToCaret。

    【讨论】:

      【解决方案3】:

      跳转到ReadOnly RichTextBox最后一行开头的简单方法

      加油!这就是我所做的。我使用富文本框作为日志显示,因此它不断接收附加到文本底部的新字符串,并且字符串总是比富文本框的宽度长。我想让最后一行始终显示,但在行的开头而不是结尾。

      我添加了一个TextChanged 事件处理程序(您可以在富文本框的属性面板中获得它)。 vbcrlf 确保最后一行始终为空行,并且由于该行中没有文本,ScrollToCaret() 将自动位于第一个字符处。除非您打开了 textwrap,否则请确保将滚动条属性设置为 both,以便用户可以滚动查看行的另一端的内容。

      请注意,此解决方案仅适用于只读富文本框。如果它不是只读的并且用户在其中输入,则每个字符都将结束起来就自己行了!将readonly 设置为true,,您的程序仍然可以更改文本 - 只是用户无法更改,最后输入的行将始终是可见的!

       Private Sub my_richtextbox_TextChanged( sender As System.Object,  e As System.EventArgs) Handles my_richtextbox.TextChanged
          With my_richtextbox
              .Text = .Text & vbcrlf
              .SelectionStart = .Text.Length
              .ScrollToCaret()
          End With
      End sub
      

      【讨论】:

        猜你喜欢
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 2016-06-03
        • 2010-10-10
        相关资源
        最近更新 更多