【问题标题】:FastColoredTextbox issue scrolling the text and positioning the caretFastColoredTextbox 问题滚动文本和定位插入符号
【发布时间】:2025-12-13 18:45:02
【问题描述】:

这个问题是关于扩展控件的:FastColoredTextbox 这里:http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting

我正在尝试自动向下滚动文本并将文本光标放在附加文本的最后一个字符(我想是文本属性的总长度)。

文本滚动问题

这适用于自动文本滚动:

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        FastColoredTextBox1.Text = str
        FastColoredTextBox1.ScrollLeft()
        FastColoredTextBox1.Navigate(FastColoredTextBox1.Lines.Count - 1)
  End Sub

...但我想让它更通用,这不起作用:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    FastColoredTextBox1.Text = str
End Sub


Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As FastColoredTextBoxNS.TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged
    sender.ScrollLeft()
    sender.Navigate(FastColoredTextBox1.Lines.Count - 1)
End Sub

任何错误或异常,都不起作用,文本不会像第一个示例那样滚动。

键盘光标位置问题

关于文本光标,我已经尝试过了,但也不行:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    FastColoredTextBox1.Text = str
    FastColoredTextBox1.SelectionStart = FastColoredTextBox1.Text.Length
End Sub

任何错误或异常,都不行。

更新

尝试了@ebyrob 解决方案但不起作用,它不会向下滚动。

Imports FastColoredTextBoxNS

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim str As String = String.Empty
        For x As Int32 = 1 To 1000 : str += vbNewLine & x : Next
        FastColoredTextBox1.Text = str
    End Sub

    Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged
        GoEnd()
    End Sub

    Public Sub GoEnd()
        If FastColoredTextBox1.Lines.Count > 0 Then
            FastColoredTextBox1.Selection.Start = New Place(FastColoredTextBox1.Lines(FastColoredTextBox1.Lines.Count - 1).Count, FastColoredTextBox1.Lines.Count - 1)
        Else
            FastColoredTextBox1.Selection.Start = New Place(0, 0)
        End If
        FastColoredTextBox1.DoCaretVisible()
    End Sub

End Class

更新二

@ebyrob 代码仅在我始终在附加文本后调用“GoEnd”时才有效,例如以下示例:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim str As String = String.Empty
    For x As Int32 = 1 To 1000 : str += vbNewLine & x : Next
    FastColoredTextBox1.Text = str
    GoEnd()
End Sub

这与我评论过的第一个问题相同(TextChanged 事件未按预期工作),我需要使其高效且通用,我认为 Control 的“TextChanged”事件将是放置“GoEnd()”的正确事件,但绝对不是。

我不想这样做:

1. Add text
2. Call GoEnd
3. Add more text
4. Call again GoEnd

我不想将“GoEnd”放在更改文本时成功的事件中以简化事情:

1. add text
2. add more text

更新三

所有问题都解决了,只是更改了事件名称:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim mytext As String = String.Empty
        For x As Int32 = 1 To 1000 : mytext += vbNewLine & x : Next
        FastColoredTextBox1.Text += mytext
        FastColoredTextBox1.Focus()
    End Sub

Private Sub FastColoredTextBox1_TextChanged(sender As Object, e As FastColoredTextBoxNS.TextChangedEventArgs) _
    Handles FastColoredTextBox1.TextChangedDelayed

    sender.ScrollLeft()
    sender.Navigate(sender.Lines.Count - 1)
    FastColoredTextBox1.SelectionStart = FastColoredTextBox1.Text.Length

End Sub

End Class

【问题讨论】:

  • 我很难理解你的问题到底是什么以及你想要达到的目标......你能详细说明一下吗?
  • “不起作用”是什么意思?由于没有将发件人转换为 FastColoredTextBox,这仅仅是一个编译错误吗?最后一个例子也不应该是.SelectionStart = FastColoredTextBox1.Text.Length - 1吗?
  • 你将不得不强制转换 sender 对象。您需要记录这个 FastColoredTextBox 组件是什么。
  • @LarsTech 好像是这个:github.com/PavelTorgashov/FastColoredTextBox/blob/master/… 好像SetCaretPos() 实际操纵键盘光标。
  • @ebyrob 我在CodeProject 找到了同一个。关键是,OP 不应该让社区猜测被质疑的组件。

标签: .net vb.net winforms visual-studio


【解决方案1】:

显然已经有专门用于此操作的方法:

    public void GoEnd()
    {
        if (lines.Count > 0)
            Selection.Start = new Place(lines[lines.Count - 1].Count,
                                        lines.Count - 1);
        else
            Selection.Start = new Place(0, 0);

        DoCaretVisible();
    }

请注意,您还需要:

Dim tbSender as FastColoredTextBox
tbSender = DirectCast(sender, FastColoredTextBox) 
tbSender.Text = str
tbSender.GoEnd()
' ...

最后我推荐:

Option Explicit

几乎在所有 VB 代码中。

编辑:测试控件后,延迟事件有效

FastColoredTextBox1.TextChangedDelayed += FastColoredTextBox1_TextChanged;

注意:这意味着每个触发事件的默认延迟为 100 毫秒。

【讨论】:

  • 感谢您的评论,我已经翻译了但不起作用(任何例外)文本没有滚动并且文本光标仍然在全文的第一个字母,您可以看到代码在我更新的问题中(对不起,因为我的英语)。
  • 当你在上面调用GoEnd()时,它在哪里附加到一个对象上?另外,您使用的是Option Explicit 吗?最后,如果您在“通用”解决方案中单击按钮两次,会发生什么情况。它会部分滚动吗?如果是这样,那么您的事件有时间问题,它可能在文本实际更新之前触发。
  • 不管最后我一一尝试所有事件,我确定问题出在事件上,是的,正确的事件是“.TextChangedDelayed”,我不需要大程序作为“goend”,因为控件有他们的方法来做到这一点,但感谢您的时间!