Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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
C# 如何从WPF RichTextBox';s textchangedventargs_C#_.net_Wpf - Fatal编程技术网

C# 如何从WPF RichTextBox';s textchangedventargs

C# 如何从WPF RichTextBox';s textchangedventargs,c#,.net,wpf,C#,.net,Wpf,我正在使用一个WPF RichTextBox,我想将它与另一个RichTextBox(在另一个窗口中)同步。我试图做的是,当发生TextChanged事件时,我尝试提取用户的更改,因此以下是我尝试的内容(用于插入): 然而,偏移量和加法长度值似乎有点不确定。当我输入第一个字符偏移量为1(我预期为0)和AddedLength为3(我预期为1)时,第二个字符偏移量为3,AddedLength为1。另外,当有5个字符时,s.CaretPosition.GetPositionAtOffset(3)返回n

我正在使用一个WPF RichTextBox,我想将它与另一个RichTextBox(在另一个窗口中)同步。我试图做的是,当发生TextChanged事件时,我尝试提取用户的更改,因此以下是我尝试的内容(用于插入):


然而,偏移量和加法长度值似乎有点不确定。当我输入第一个字符偏移量为1(我预期为0)和AddedLength为3(我预期为1)时,第二个字符偏移量为3,AddedLength为1。另外,当有5个字符时,
s.CaretPosition.GetPositionAtOffset(3)
返回null。总而言之,我对如何基于事件参数从RichTextBox获取相关内容感到非常困惑。您能提出一些建议吗?

您需要阅读MSDN中描述文本ChangedEventArgs属性的以下内容。当事件发生时,基础格式可能会发生多个更改,因此您需要处理提供的e.changes项集合,从第一个到最后一个一次处理一个


您不应该查看插入符号位置,因为这不会告诉您底层文本发生了什么。同样,在提供的链接中对此进行了更详细的解释。

阅读文档后,我对这一点有了更好的理解,并检查了RichTextBox的FlowDocument的纯文本表示,但我仍然不了解偏移值以及如何提取用户的更改(按1输入字符时,e.Changes.Count始终为1)
void rtb_TextChanged(object sender, TextChangedEventArgs e)
{
    var change = e.Changes.FirstOrDefault();
    var s = sender as RichTextBox;

    var start = s.CaretPosition.GetPositionAtOffset(change.Offset);
    var end = s.CaretPosition.GetPositionAtOffset(change.Offset + change.AddedLength);
    var range = new TextRange(start, end);
}