C# 控制RichTextBox中的水平滚动

C# 控制RichTextBox中的水平滚动,c#,winforms,richtextbox,C#,Winforms,Richtextbox,我有一个RichTextBox,我正在向其中输出日志信息,但是每当添加太长而无法容纳的文本时,RichTextBox似乎想要水平滚动 在广泛搜索并反复使用ScrollToCaret()失败后,此函数似乎控制垂直滚动位置,但不控制水平滚动位置。我还尝试使用API调用GetScrollRange()和SetScrollPos(),虽然这些调用确实将滚动条放置在正确的位置,但它们无法控制RichTextBox滚动的实际位置。日志中每个日志信息的末尾是否都没有换行?使用System.Environmen

我有一个RichTextBox,我正在向其中输出日志信息,但是每当添加太长而无法容纳的文本时,RichTextBox似乎想要水平滚动


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

日志中每个日志信息的末尾是否都没有换行?使用System.Environment.Newline在将其放入richtextbox之前附加到每行的末尾。在CodeProject上看一看这个,它可能会帮助您并使您朝着正确的方向前进

希望这有帮助, 顺致敬意,
Tom。

是否日志中每个日志信息的末尾都没有换行符?使用System.Environment.Newline在将其放入richtextbox之前附加到每行的末尾。在CodeProject上看一看这个,它可能会帮助您并使您朝着正确的方向前进

希望这有帮助, 顺致敬意,
汤姆。

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

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

跳转到只读RichTextBox最后一行开始的简单方法 萨尔维特!这就是我所做的。我使用一个richtext框作为日志显示,因此它不断地接收附加到文本底部的新字符串,并且字符串总是比richtext框的宽度长。我想让最后一行始终显示出来,但是在行的开头而不是结尾

我添加了一个
TextChanged
事件处理程序(您可以在richtext框的properties面板中找到它)。
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
跳转到只读RichTextBox最后一行开始的简单方法 萨尔维特!这就是我所做的。我使用一个richtext框作为日志显示,因此它不断地接收附加到文本底部的新字符串,并且字符串总是比richtext框的宽度长。我想让最后一行始终显示出来,但是在行的开头而不是结尾

我添加了一个
TextChanged
事件处理程序(您可以在richtext框的properties面板中找到它)。
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

最初,当我添加文本时,我正在执行Environment.NewLine+text。我把它调换了一下,ScrollToCaret()现在就完成了。尽管这并没有我想要的那么优雅(RTB底部的额外行真的让我很烦恼),但它可以在不需要担心导入任何内容的情况下工作。谢谢最初,当我添加文本时,我正在执行Environment.NewLine+text。我把它调换了一下,ScrollToCaret()现在就完成了。尽管这并没有我想要的那么优雅(RTB底部的额外行真的让我很烦恼),但它可以在不需要担心导入任何内容的情况下工作。谢谢