Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将光标标记为粘贴在其所在的字符位置?(WPF RichTextBox)_Wpf_Vb.net_Richtextbox - Fatal编程技术网

如何将光标标记为粘贴在其所在的字符位置?(WPF RichTextBox)

如何将光标标记为粘贴在其所在的字符位置?(WPF RichTextBox),wpf,vb.net,richtextbox,Wpf,Vb.net,Richtextbox,我正在使用WPF richtextbox为文本框中提供的代码创建语法高亮显示。我想让它在我打字时自动调整rich textbox,使用线程计时器重置rich textbox的内容。我试图将光标保持在预期位置。在解析过程中,我没有丢失任何文本字符(换行符除外)。我不知道如何将插入符号保持在用户在文本中留下的位置。它默认为文档的结尾 我尝试将当前插入符号位置存储在文本中,然后在进行更改后将其设置为文档,但收到的错误是“无法将插入符号位置设置为RichTextBox之外”。因此,我将插入符号位置设置为

我正在使用WPF richtextbox为文本框中提供的代码创建语法高亮显示。我想让它在我打字时自动调整rich textbox,使用线程计时器重置rich textbox的内容。我试图将光标保持在预期位置。在解析过程中,我没有丢失任何文本字符(换行符除外)。我不知道如何将插入符号保持在用户在文本中留下的位置。它默认为文档的结尾

我尝试将当前插入符号位置存储在文本中,然后在进行更改后将其设置为文档,但收到的错误是“无法将插入符号位置设置为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
公共子格式文本()
如果为Nothing(rtfContent.Document),则
出口接头
如果结束
Me.rtfContent.IsEnabled=False
Me.rtfContent.Refresh()
我
系统线程线程睡眠(50)
Dim curRange As TextRange=新文本范围(rtfContent.Document.ContentStart,rtfContent.CaretPosition)
Dim CARETBFORE As TextPointer=rtfContent.CaretPosition
caretBefore=新文本范围(caretBefore,caretBefore.DocumentEnd)。开始
Dim caretBeforeOffset As Integer=rtfContent.Document.ContentStart.GetOffsetPosition(caretBefore)
Dim docRange As TextRange=新文本范围(rtfContent.Document.ContentStart、rtfContent.Document.ContentEnd)
docRange.ClearAllProperties()
将myText设置为字符串=docRange.Text
按列表(字符串的)调整行的尺寸=拆分(myText,vbCrLf)。ToList
将MyBlocks调整为新列表(块的)
Dim计数为整数=1
MyVars.Clear()
myText=“”
每行中的每一行
如果计数=行,则计数
退出
如果结束
如果中间(直线,1,1)=“$”则
将单词设置为字符串()=拆分(第,“,2行)
MyVars.Add(单词(0))
myText&=“”&Line&“”
ElseIf Mid(第1,1行)=“#”然后
myText&=“”&Line&“”
其他的
myText&=“”&Line&“”
如果结束
计数+=1
下一个
myText=Regex.Replace(myText,\$(\w*),“$$$1”)
对于MyVar中的每个var
myText=Regex.Replace(myText,“\”&var&“,”&var&“)
下一个
myText=myText.Replace(“复制”、“复制”)
myText=myText.Replace(“删除”、“删除”)
myText=myText.Replace(“输出”、“输出”)
myText=myText.Replace(“清除”、“清除”)
myText=“&myText&”
Me.rtfContent.Document.Blocks.Clear()
Me.rtfContent.Document=TryCast(XamlReader.Parse(myText),FlowDocument)
caretBefore=caretBefore.DocumentStart.GetPositionAtOffset(caretBeforeOffset,LogicalDirection.Forward)
尝试
Me.rtfContent.CaretPosition=caretBefore
抓住
Me.rtfContent.CaretPosition=rtfContent.Document.ContentEnd
结束尝试
Me.rtfContent.IsEnabled=True
Me.rtfContent.Refresh()
我
端接头

我有一个可能有用的主意。
Point-GetPositionFromCharIndex(int-index)
PointToClient
PointToScreen
函数是否有帮助?您可以存储鼠标光标所在的字符索引,并在生成代码后将其放回上述位置。您可以找到这些函数的用法。

我有一个想法可能会有所帮助。
Point-GetPositionFromCharIndex(int-index)
PointToClient
PointToScreen
函数是否有帮助?您可以存储鼠标光标所在的字符索引,并在生成代码后将其放回上述位置。您可以找到这些函数的用法。

由于某些原因,这些函数对我不可用,我使用的是.net 4.0。这为我指明了正确的方向,但如果我找不到这些函数,这对我没有帮助。你知道我在哪里可以公开这些函数吗。请记住,我是在vb.net中编写代码的。由于某些原因,这些函数对我不可用,我使用的是.net 4.0。这为我指明了正确的方向,但如果我找不到这些函数,这对我没有帮助。你知道我在哪里可以公开这些函数吗。记住我是用vb.net编写代码的。