问题描述
我有一个 UserControl
,其中包含一个 TextBox
。当用户控件变得可见时,我将重点放在 TextBox
上。有人可以弄清楚为什么我必须使用 Dispatcher
吗?
I have a UserControl
that contains a TextBox
. When the user control becomes visible, I give the TextBox
focus. Could somebody clarify why I have to do this using the Dispatcher
?
public MyUserControl()
{
InitializeComponent();
this.IsVisibleChanged += VisibilityChanged;
}
案例1(有效):
private void VisibilityChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.Visibility == Visibility.Visible)
{
this.Dispatcher.BeginInvoke((Action)delegate
{
Keyboard.Focus(this.InputTextBox);
}, DispatcherPriority.Render);
}
}
案例2(无效):
private void VisibilityChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.Visibility == Visibility.Visible)
{
Keyboard.Focus(InputTextBox);
}
}
推荐答案
可以您在 InputTextBox.IsVisibleChanged
而不是的事件处理程序中调用
? Keyboard.Focus(InputTextBox);
> this.IsVisibleChanged
could you call Keyboard.Focus(InputTextBox);
in the event handler for InputTextBox.IsVisibleChanged
instead of this.IsVisibleChanged
?
如果这行得通,那么我怀疑在布局面板更新子控件之前引发 this.IsVisibleChanged
事件,即当您将焦点放在没有 BeginInvoke
的 InputTextBox
上仍然不可见。
If this works then I suspect the this.IsVisibleChanged
event is raised before the layout panel has updated the children controls, i.e perhaps InputTextBox
is still not visible when you put focus on it without BeginInvoke
.
这篇关于为什么从后面的代码设置键盘焦点需要Dispatcher.BeginInvoke?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!