[英]How do I mark the cursor to stick in the character position it was at? (WPF RichTextBox)
我正在使用WPF richtextbox為文本框中提供的代碼創建語法突出顯示。 我想讓它在鍵入時自動調整富文本框,使用線程計時器重置富文本框的內容。 我試圖將光標保持在應該的位置。 在解析過程中,我不會丟失任何文本字符(換行符除外)。 我不知道如何保持插入符在用戶在文本中留下的位置。 它默認為文檔末尾。
我嘗試將當前的插入符號位置存儲在文本中,然后在進行更改后將其設置為文檔,但是,我收到的錯誤是“無法將CaretPosition設置為RichTextBox之外。” 因此,將插入號位置設置為文檔的底部。
WPF,VB.net,.net Framework 4.0
這是代碼。
Public Sub FormatText()
If IsNothing(rtfContent.Document) Then
Exit Sub
End If
Me.rtfContent.IsEnabled = False
Me.rtfContent.Refresh()
Me.Refresh()
System.Threading.Thread.Sleep(50)
Dim curRange As TextRange = New TextRange(rtfContent.Document.ContentStart, rtfContent.CaretPosition)
Dim caretBefore As TextPointer = rtfContent.CaretPosition
caretBefore = New TextRange(caretBefore, caretBefore.DocumentEnd).Start
Dim caretBeforeOffset As Integer = rtfContent.Document.ContentStart.GetOffsetToPosition(caretBefore)
Dim docRange As TextRange = New TextRange(rtfContent.Document.ContentStart, rtfContent.Document.ContentEnd)
docRange.ClearAllProperties()
Dim myText As String = docRange.Text
Dim Lines As List(Of String) = Split(myText, vbCrLf).ToList
Dim MyBlocks As New List(Of Block)
Dim count As Integer = 1
MyVars.Clear()
myText = ""
For Each Line In Lines
If count = Lines.Count Then
Exit For
End If
If Mid(Line, 1, 1) = "$" Then
Dim words As String() = Split(Line, " ", 2)
MyVars.Add(words(0))
myText &= "<Paragraph Margin=""0,0,0,0"" Padding=""0,0,0,2"">" & Line & "</Paragraph>"
ElseIf Mid(Line, 1, 1) = "#" Then
myText &= "<Paragraph Margin=""0,0,0,0"" Padding=""0,0,0,2""><Run Foreground=""#FFFFA500"">" & Line & "</Run></Paragraph>"
Else
myText &= "<Paragraph Margin=""0,0,0,0"" Padding=""0,0,0,2"">" & Line & "</Paragraph>"
End If
count += 1
Next
myText = Regex.Replace(myText, "\$(\w*)", "<Run Foreground=""#FFFF0000"">$$$1</Run>")
For Each var In MyVars
myText = Regex.Replace(myText, "<Run Foreground=""#FFFF0000"">\" & var & "</Run>", "<Run Foreground=""#FF32CD32"">" & var & "</Run>")
Next
myText = myText.Replace("copy", "<Run Foreground=""#FF87CEFA"">copy</Run>")
myText = myText.Replace("delete", "<Run Foreground=""#FF87CEFA"">delete</Run>")
myText = myText.Replace("output", "<Run Foreground=""#FF87CEFA"">output</Run>")
myText = myText.Replace("clear", "<Run Foreground=""#FF87CEFA"">clear</Run>")
myText = "<FlowDocument PagePadding=""5,0,5,0"" AllowDrop=""True"" NumberSubstitution.CultureSource=""User"" xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">" & myText & "</FlowDocument>"
Me.rtfContent.Document.Blocks.Clear()
Me.rtfContent.Document = TryCast(XamlReader.Parse(myText), FlowDocument)
caretBefore = caretBefore.DocumentStart.GetPositionAtOffset(caretBeforeOffset, LogicalDirection.Forward)
Try
Me.rtfContent.CaretPosition = caretBefore
Catch
Me.rtfContent.CaretPosition = rtfContent.Document.ContentEnd
End Try
Me.rtfContent.IsEnabled = True
Me.rtfContent.Refresh()
Me.Refresh()
End Sub
我有一個想法可能會有所幫助。 Point GetPositionFromCharIndex(int index)
, PointToClient
和PointToScreen
函數是否有幫助? 您可以存儲鼠標指針懸停在哪個char索引上,並在生成代碼后將其放回上述位置。 您可以在此處找到這些功能的用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.