这是一个奇怪的问题,我甚至不知道该搜索什么,但请相信我已经尝试过了。
我有一个文本框,并绑定了以下方法到它的 OnTextChanged
事件。
这里的目的是给文本框焦点,将光标移动到文本框的末尾,然后将焦点返回到实际上具有焦点的元素(通常是一个按钮)。问题在于,在我将焦点返回到最初具有焦点的元素之前,似乎文本框没有被“重新绘制”(缺乏更好的词?),因此屏幕上的光标位置不会更新(尽管所有属性都认为已经更新了)。
目前,我已经粗暴地将其组合在一起,基本上延迟了先前具有焦点项的重新聚焦 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()));