在RichEditBox中设置Text时的AccessViolationException

我花了好几个小时试图了解这里发生的事情。 我有一个RichEditBox,用户可以通过点击它,使用键盘或点击几个在RichEditBox中添加一些字符的按钮来与之交互。 这是我使用的方法:

private void ptrPlus_click(object sender, RoutedEventArgs e) { try { myRichEditBox.Document.Selection.Text = ">"; myRichEditBox.Document.Selection.SetRange(this.Document.Selection.StartPosition + 1, this.Document.Selection.StartPosition + 1); } catch { // } } 

什么有效:

•如果我使用键盘在RichEditBox中写入,它可以正常工作

•如果我使用像这样的按钮,它可以正常工作,并且字符会被添加到RichEditBox中

什么行不通:

•如果我在RichEditBox内部点击(要么在内部写入,要么只是为了使键盘出现,然后在它外部点击以关闭它),然后再次使用该按钮添加一些字符,它适用于前两个我按下按钮。 在第三个,我得到一个System.AccessViolationException和我的应用程序崩溃了

 myRichEditBox.Document.Selection.Text = ">"; 

应用程序崩溃,即使该行在try / catch中,我不知道为什么。 我尝试在RichEditBox获得焦点之前和之后检查Selection index位置和Selection lenght的状态,并且它似乎没有任何改变。 所以我真的不知道这里发生了什么:/

在此先感谢您的帮助! 塞尔吉奥

编辑:我为LostFocus事件添加了这个处理程序:

 void MyRichEditBox_LostFocus(object sender, RoutedEventArgs e) { String temp; int start = this.Document.Selection.StartPosition, end = this.Document.Selection.EndPosition; this.Document.GetText(TextGetOptions.FormatRtf, out temp); this.Document.SetText(TextSetOptions.FormatRtf, temp); this.Document.Selection.SetRange(start, end); } 

这应该是毫无意义的,但我发现它“修复了错误”(即使这不应该做任何事情)。 缺点是它在Document的末尾添加了一个新行,我怀疑这是因为RichEditBox默认添加了额外的\ r \ n。 关于为什么这个处理程序不会让应用程序崩溃和/或如何摆脱额外的最终\ r \ n的任何想法? 谢谢!

EDIT2:我在该方法中停止了调试,我发现Rtf字符串在它的末尾没有包含\ r \ n,但是它有一系列\ par使得RichEditBox每次都添加一个新行。 我试过了:

 temp = temp.Replace(@"\par", ""); 

在SetSext方法之前,但这只是弄乱了文档的内容,即使它确实停止了RichEditBox添加新行。 如果我能找到一种方法来删除那些\ par而不破坏Rtf内容,我会的。