FastColoredTextbox问题滚动文本并定位插入符号

时间:2013-05-31 12:55:35

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

这个问题与扩展控件有关: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

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

  

键盘光标位置问题

关于text-cursor,我试过这个但是也不行:

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事件没有按预期工作)的问题,我需要使它高效且通用,我认为控件的“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

1 个答案:

答案 0 :(得分:2)

显然,这个操作已经有了一种方法:

    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毫秒。