0

我正在尝试开发一个功能,用户可以从 hastags 和 FriendList 列表中进行选择,并在他使用自动建议键入时将它们添加到 RichEditBox,有点像自动完成。这是执行此操作的代码。

private void MentionSuggestionList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count > 0)
        {
            bool flag = false;
            int index = 0;
            for (int i = PostRichEditBox.Document.Selection.EndPosition - 1; i >= 0; i--)
            {
                if (Char.IsLetterOrDigit(_postText[i]) || _postText[i] == '_')
                {
                    continue;
                }
                else if (_postText[i] == '@' || _postText[i] == '#')
                {
                    flag = true;
                    index = i + 1;
                    break;
                }
                else
                {
                    break;
                }
            }
            if (flag)
            {
                PostRichEditBox.Document.Selection.StartPosition = index;

                //AccessViolationException here
                PostRichEditBox.Document.Selection.SetText(TextSetOptions.None, (e.AddedItems[0] as MentionUserModel).screenName + " "); 
                PostRichEditBox.Document.Selection.StartPosition = PostRichEditBox.Document.Selection.EndPosition;
            }
        }
    }

但是当我更改richeditbox 的选择文本时,我会随机获取 AccessViolation。它是随机的,但它足够频繁,以至于我每次都可以在几次尝试中复制它。我什至可以捕捉到这个异常。我应该怎么办?

与我在 msdn 上的问题类似,据此,这是一个已知问题。但是 Rudy huyn 的 6tag 完美地做到了这一点。如何?

我试图用 TextBox 改变 RichEditBox 并且它仍然发生在那个控件上。

4

2 回答 2

0

通过更改 RichEditBox 外部的所有文本然后将其添加回来来解决它。不过,这只是一种解决方法。我希望 win rt 更稳定,功能更丰富,如 silverlight。

private void MentionSuggestionList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int endpos = PostRichEditBox.Document.Selection.EndPosition;
        int startpos = PostRichEditBox.Document.Selection.StartPosition;
        if (e.AddedItems.Count > 0)
        {
            bool flag = false;
            int index = 0;
            for (int i = PostRichEditBox.Document.Selection.EndPosition - 1; i >= 0; i--)
            {
                if (Char.IsLetterOrDigit(_postText[i]) || _postText[i] == '_')
                {
                    continue;
                }
                else if (_postText[i] == '@' || _postText[i] == '#')
                {
                    flag = true;
                    index = i + 1;
                    break;
                }
                else
                {
                    break;
                }
            }
            if (flag)
            {
                //PostRichEditBox.Document.Selection.StartPosition = index;
                //PostRichEditBox.Document.Selection.EndPosition = endpos;
                String post="";
                PostRichEditBox.Document.GetText(TextGetOptions.None, out post);
                string result = post.Substring(0, index);
                result = result + (e.AddedItems[0] as MentionUserModel).screenName + " ";
                result = result + post.Substring(endpos, (post.Length - 1) - endpos);

                int size = endpos - index;
                size = ((e.AddedItems[0] as MentionUserModel).screenName + " ").Length - size;

                PostRichEditBox.Document.SetText(TextSetOptions.None, result);
                //PostRichEditBox.Document.Selection.SetText(TextSetOptions.None, (e.AddedItems[0] as MentionUserModel).screenName + " ");
                PostRichEditBox.Document.Selection.StartPosition = PostRichEditBox.Document.Selection.EndPosition = size + endpos;
            }
        }
    }
于 2015-07-29T06:55:55.860 回答
0

您可以使用以下语法重试:

PostRichEditBox.Document.Selection。FormattedText .SetText(…);

这应该可以永久解决您的问题,而无需使用变通方法。我最好的祝福!

于 2016-01-07T23:52:45.430 回答