C# 在RichEditBox中设置文本时AccessViolationException

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 = ">";

我花了几个小时试图了解这里发生了什么。 我有一个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时,我试着在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", "");