C# 在RichEditBox中设置文本时AccessViolationException
我花了几个小时试图了解这里发生了什么。 我有一个RichEditBox,用户可以通过点击它并使用键盘或点击几个按钮在RichEditBox中添加一些字符来与之交互。 这是我使用的一种方法:C# 在RichEditBox中设置文本时AccessViolationException,c#,xaml,windows-store-apps,windows-phone-8.1,win-universal-app,C#,Xaml,Windows Store Apps,Windows Phone 8.1,Win Universal App,我花了几个小时试图了解这里发生了什么。 我有一个RichEditBox,用户可以通过点击它并使用键盘或点击几个按钮在RichEditBox中添加一些字符来与之交互。 这是我使用的一种方法: private void ptrPlus_click(object sender, RoutedEventArgs e) { try { myRichEditBox.Document.Selection.Text = ">";
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时,我试着在RichEditBox获得焦点前后检查选择索引位置和选择长度的状态,它们似乎没有任何变化。所以我真的不知道这里发生了什么:/
提前感谢您的帮助!
塞尔吉奥
编辑:
我为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);
}
这应该是毫无意义的,但我发现它“修复了错误”(即使这不应该做任何事情)。缺点是它在文档末尾添加了一个新行,我怀疑这是因为RichEditBox默认情况下添加了额外的\r行。
关于此处理程序为什么不再让应用程序崩溃和/或如何摆脱额外的final\r\n的任何想法?谢谢
编辑2:
我停止了该方法内部的调试,发现Rtf字符串结尾不包含\r,但它有一系列\par,使得RichEditBox每次都添加一行新行。
我试过:
在setText方法之前,但这只会弄乱文档的内容,即使它确实停止了RichEditBox以添加新行。
如果我能找到一种方法,在不破坏Rtf内容的情况下删除这些\par,我将立即通知您。如果有,AV的错误文本是什么?您所说的AV是什么意思?我在输出控制台和生成异常的行上方弹出的窗口中获得“myAppName.exe中的'System.AccessViolationException'类型的首次机会异常”myAppName.ni.EXE Ulteriori informazioni中“System.AccessViolationException”类型的未处理异常:试图读取或写入受保护内存。这通常表示其他内存已损坏。“。我真的不知道为什么只有当我点击RichEditBox,然后点击它的外部,然后点击其中一个按钮整整三次,才会发生这种情况…”|我用我发现的一些东西编辑了这个问题,如果这些可能有帮助的话:)事实上,我刚才问的一个问题有一些关键的相似之处,一直到第三个行动是重要的。(). 另外,我认为您不能用普通的try/catch块捕获AccessViolationException。有一个属性可以添加到方法中,但当我尝试添加它时,它看起来不可用(请参见备注:),您找到了解决方案吗?
temp = temp.Replace(@"\par", "");