【问题标题】:WPF Move Caret position after inserting list插入列表后WPF移动插入符号位置
【发布时间】:2018-11-14 23:19:10
【问题描述】:

我正在将列表插入到这样的 RichTextBox 中 - 但如何让插入符号移动到第一个列表项?

 Private Sub TextEditor_BulletListAdd(sender As Object, e As RoutedEventArgs)
    Try
      Dim vEditor As RichTextBox = TextEditorGrid.FindName("Controls_TextEditorRTF")
        Dim vList As New List()
        vList.MarkerStyle = TextMarkerStyle.Disc
        Dim vRun As New Run()
        Dim vItem As New ListItem(New Paragraph(vRun))
        vList.ListItems.Add(vItem)
        Dim curCaret = vEditor.CaretPosition
        Dim curBlock = vEditor.Document.Blocks.Where(Function(x) x.ContentStart.CompareTo(curCaret) = -1 AndAlso x.ContentEnd.CompareTo(curCaret) = 1).FirstOrDefault()
        vEditor.Document.Blocks.InsertAfter(curBlock, vList)

    Catch ex As Exception
        EmailError(ex)
    End Try
End Sub

Private Sub TextEditor_NumberListAdd(sender As Object, e As RoutedEventArgs)
    Try
        Dim vEditor As RichTextBox = TextEditorGrid.FindName("Controls_TextEditorRTF")
        Dim vList As New List()
        vList.MarkerStyle = TextMarkerStyle.Decimal
        Dim vRun As New Run()
        Dim vItem As New ListItem(New Paragraph(vRun))
        vList.ListItems.Add(vItem)
        Dim curCaret = vEditor.CaretPosition
        Dim curBlock = vEditor.Document.Blocks.Where(Function(x) x.ContentStart.CompareTo(curCaret) = -1 AndAlso x.ContentEnd.CompareTo(curCaret) = 1).FirstOrDefault()
        vEditor.Document.Blocks.InsertAfter(curBlock, vList)
    Catch ex As Exception
        EmailError(ex)
    End Try
End Sub

【问题讨论】:

  • 嘿,版主们,你们看到你们的新限制性规则在这里做了什么吗?对答案的限制也是如此……请删除它们!

标签: wpf list richtextbox caret


【解决方案1】:

简单的部分是设置插入符号的位置...棘手的部分是找到要设置的位置的指针(除非它只是文档的开头或结尾):

RichTextBox rtb = new RichTextBox(flowDoc);
// Get the current caret position.
TextPointer caretPos = rtb.CaretPosition;
// Set the TextPointer to the end of the current document.

caretPos = caretPos.DocumentEnd; // <<< You need to find the correct position here

// Specify the new caret position at the end of the current document.
rtb.CaretPosition = caretPos;

来自 MSDN 上的RichTextBox.CaretPosition Property

【讨论】:

  • 这是我遇到问题的棘手部分 :-) - 有人可以在文档中的任何位置插入列表,我希望插入符号位置从插入点移动到第一个列表项(就在子弹之后)
  • 如果您只需要从当前插入符号位置导航到第一个列表项,这可能还不错。听起来它也总是相同的运动。查看 MSDN 上的TextPointer Class 寻求帮助。
【解决方案2】:

原来答案比我想象的要简单得多:-)

 Dim vMove As TextPointer = curCaret.GetNextInsertionPosition(LogicalDirection.Forward)
        If Not vMove Is Nothing Then
            vEditor.CaretPosition = vMove
        End If

完成

Private Sub TextEditor_BulletListAdd(sender As Object, e As RoutedEventArgs)
    Try
      Dim vEditor As RichTextBox = TextEditorGrid.FindName("Controls_TextEditorRTF")
        Dim vList As New List()
        vList.MarkerStyle = TextMarkerStyle.Disc
        Dim vRun As New Run()
        Dim vItem As New ListItem(New Paragraph(vRun))
        vList.ListItems.Add(vItem)
        Dim curCaret = vEditor.CaretPosition
        Dim curBlock = vEditor.Document.Blocks.Where(Function(x) x.ContentStart.CompareTo(curCaret) = -1 AndAlso x.ContentEnd.CompareTo(curCaret) = 1).FirstOrDefault()
        vEditor.Document.Blocks.InsertAfter(curBlock, vList)
        Dim vMove As TextPointer = curCaret.GetNextInsertionPosition(LogicalDirection.Forward)
        If Not vMove Is Nothing Then
            vEditor.CaretPosition = vMove
        End If
    Catch ex As Exception
        EmailError(ex)
    End Try
End Sub

【讨论】:

  • 它们确实很灵活,FlowDocuments,但它们不是直观的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多