在RichEditBox中设置Text时的AccessViolationException

时间:2014-11-09 17:08:44

标签: 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 = ">";
            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。

0 个答案:

没有答案