2015-07-29 2 views
0

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

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 here, согласно которому это известная проблема. Но Ragy huyn's 6tag делает это безупречно. как?

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

ответ

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

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

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

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

Смежные вопросы