我有一个我正在向其发送日志信息的RichTextBox,但RichTextBox似乎想要在附加文本太长而不适合时水平滚动。
经过广泛搜索,并且反复失败ScrollToCaret()
,似乎这个函数控制垂直滚动位置,但不控制水平位置。我还尝试使用API调用GetScrollRange()
和SetScrollPos()
,虽然这些调用会将滚动条放在正确的位置,但它们并不控制RichTextBox滚动的实际位置。
答案 0 :(得分:1)
可能是日志中每个日志信息的末尾没有换行符吗?使用System.Environment.Newline附加到每行的末尾,然后将其放入richtextbox。在 CodeProject 上查看此article,这可能会对您有所帮助并使您朝着正确的方向前进。
希望这有帮助, 最好的祝福, 汤姆。
答案 1 :(得分:0)
这有点乱,但应该有效: 当您执行ScrollToCaret并且水平滚动位置发生更改时,它会触发HScroll事件。如果在您不希望发生HScroll事件时,可以将水平滚动条移回 1.将selectionstart移动到前一个crlf之后的1个字符 2.将selectionstart设置为该位置,然后 3. ScrollToCaret。
答案 2 :(得分:0)
Salvete!这就是我做的。我使用富文本框作为日志记录显示,因此它不断接收附加到文本底部的新字符串,并且字符串总是比richtext框宽。我希望最后一行始终显示,但是在行的开头而不是结尾。
我添加了一个TextChanged
事件处理程序(您可以在richtext框的属性面板中获取它)。 vbcrlf
确保最后一行始终为空行,并且由于该行中没有文本,ScrollToCaret()
将自动位于第一个字符处。除非您打开了textwrap,否则请确保将滚动条属性设置为both
,以便用户可以滚动查看行的另一端的内容。
请注意,此解决方案仅适用于只读 richtext框。如果它不是只读且用户输入,则每个字符都将结束靠自己的路线!将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