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 hereに関する私の質問に似たもので、既知の問題です。しかし、Rudy huyn の 6tag はこれを完璧に行います。どうやって?

RichEditBox を TextBox に変更しようとしましたが、そのコントロールでも引き続き発生します。

4

2 に答える 2

0

次の構文を使用して再試行できます。

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

これにより、回避策を使用せずに問題を完全に解決できます。よろしくお願いします!

于 2016-01-07T23:52:45.430 に答える
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 に答える