2017-05-14 4 views
1

TextBoxをベースにした入力フィルタを使用してテキストコントロールを作成しています。TextChangingハンドラでSelectionStartを変更する

主なアイデアは、TextChangingイベントを処理し、正しいTextおよびSelectionStart値を設定することです。

これはWindows 10 Creators Updateまで機能​​しました。 TextChangingハンドラでSelectionStartを変更すると、UIのキャレットの位置が正しく表示されますが、次の文字は古い場所に移動します。

私は今すぐコードを共有することはできませんが、各TextChangingコールで任意の文字を追加することで再現できます(この文字の後にSelectionStartを設定する)。

Microsoftに下位互換性が壊れていますか?私は間違った何かをしましたか?

UPD:

async void OnTextChanging(TextBox sender, Text​Box​Text​Changing​Event​Args args) 
{ 
    var newText = HandleText(Text); 
    var newSelectionStart = HandleTextDiff(newText, Text); 
    Text = newText; 

    await Task.Yield(); 
    SelectionStart = newSelectionStart; 
} 

Task.Yieldが制御内部割り当て後に非同期で実行するようにしたselectionStartの割り当てを行いますので、私は汚い回避策を見つけました。

キャレットが点滅することがありますが、私が見つけることができる唯一の解決策であるため、これは非常に汚れて醜いです。

+0

を使用するかもしれません0

にSelectionLengthを設定してみる必要があります。 –

+0

@LeiYangお願いします。 – llvk

答えて

0

たぶん、あなたは別のオプションは、あなたがコントロールを書いている場合は、ちょうどTextChangingイベントを処理することは十分ではないかもしれないSetCaretPos API呼び出し

[DllImport("User32.dll")] 
static extern bool SetCaretPos(int x, int y); 
+0

SelectionLengthとSelectionStartの設定は、TextBox.Select(int、int)呼び出しに相当します。それで、うまくいきません。 TextChangingが終了した後、UIの選択は正しいですが、入力の選択が壊れています。 – llvk

関連する問題