我花了好几个小时试图了解这里发生的事情。 我有一个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添加新行。 我会在没有破坏Rtf内容的情况下找到一种方法来删除那些\ par。