これは奇妙なものであり、何を検索すればよいかさえわかりませんが、私が持っていると信じてください.
テキストボックスがあり、そのOnTextChanged
イベントにバインドされているのは以下のメソッドです。
ここでの目的は、テキスト ボックスにフォーカスを与え、カーソルを TextBox の末尾に移動し、実際にフォーカスされていたもの (通常はボタン) にフォーカスを戻すことです。問題は、フォーカスを元のフォーカスされた要素に戻す前に、TextBox が「再描画」されていないように見えることです (ただし、すべてのプロパティは更新されていると考えています)。 .
現在、私はこれを一緒に残酷にハックして、基本的に前にフォーカスされたアイテムの再フォーカスを 10 ミリ秒遅らせ、別のスレッドで実行して、UI を更新する時間を確保しました。さて、これは明らかに任意の時間であり、私のマシンでは問題なく動作しますが、古いマシンでこのアプリを実行している人には問題がある可能性があります.
これを行う適切な方法はありますか?私はそれを理解することはできません。
private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
{
if (sender == null) return;
var box = sender as TextBox;
if (!box.IsFocused)
{
var oldFocus = FocusManager.GetFocusedElement(FocusManager.GetFocusScope(this));
box.Select(box.Text.Length, 0);
Keyboard.Focus(box); // or box.Focus(); both have the same results
var thread = new Thread(new ThreadStart(delegate
{
Thread.Sleep(10);
Dispatcher.Invoke(new Action(() => oldFocus.Focus()));
}));
thread.Start();
}
}
編集
私が持っていた新しいアイデアは、UIの更新が完了したら oldFocus.Focus() メソッドを実行することだったので、次のことを試しましたが、同じ結果が得られました:(
var oldFocus = FocusManager.GetFocusedElement(FocusManager.GetFocusScope(this));
Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
{
box.Select(box.Text.Length, 0);
box.Focus();
}));
Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => oldFocus.Focus()));