Изменение текста выделения RichEditBox создает исключение AccessViolationException

Я пытаюсь разработать функцию, где пользователь может выбрать из списка hastags и FriendList и добавить их в RichEditBox, когда он печатает, используя подсказки Auto, вроде как автозаполнение. Вот код, который делает это.

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;
            }
        }
    }

Но я получаю AccessViolation случайно, когда я изменяю текст выбора richeditbox. Он случайный, но достаточно частый, так что я могу повторить его каждый раз лишь в нескольких попытках. Я даже могу поймать это исключение. Что я должен делать?

Нечто похожее на мой вопрос о MSDN здесь, в соответствии с которым его известная проблема. Но 6-тэг Руди Хьюна делает это безупречно. как?

Я попытался изменить RichEditBox с TextBox, и это все еще происходит на этом элементе управления.

2 ответа

Вы можете повторить попытку, используя следующий синтаксис:

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

Это должно навсегда решить вашу проблему без использования обходных путей. Мои наилучшие пожелания!

Решил это, изменив весь текст вне 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;
            }
        }
    }
Другие вопросы по тегам