问题描述
我有一个包含 TextBox
的 UserControl
.当用户控件变得可见时,我将焦点放在 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
事件,即当您放置时,可能 InputTextBox
仍然不可见在没有 BeginInvoke
的情况下专注于它.
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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!