Изменение текста выделения 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;
}
}
}