我有一个小的DataForm,我想将焦点设置在第一个TextBox上。我使用的是2009年11月的工具包。我已经为TextBox命名,并尝试在DataForm的loaded事件中使用.Focus()。我看到它获得了一次光标“闪烁”的焦点,然后就消失了。我正在努力确定这是否是DataForm的副作用还是其他原因。有人知道我是否能够做到这一点吗?
我有一个小的DataForm,我想将焦点设置在第一个TextBox上。我使用的是2009年11月的工具包。我已经为TextBox命名,并尝试在DataForm的loaded事件中使用.Focus()。我看到它获得了一次光标“闪烁”的焦点,然后就消失了。我正在努力确定这是否是DataForm的副作用还是其他原因。有人知道我是否能够做到这一点吗?
我尝试了许多在各种互联网站上流传的建议,例如使用Dispatcher、UpdateLayout等等,但它们都不能可靠地工作。最终,我选择了以下方法:
private bool _firstTime = true;
private void MyChildWindow_GotFocus(object sender, RoutedEventArgs e)
{
if (_firstTime)
{
try
{
var dataForm = MyDataForm;
var defaultFocus = dataForm.FindNameInContent("Description") as TextBox;
defaultFocus.Focus();
}
catch (Exception)
{
}
finally
{
_firstTime = false;
}
}
}
虽然不太美观,但它能用。在SL4中使用Focus()方法似乎存在时间问题。
private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
TextBox usernameBox = (TextBox)sender;
Dispatcher.BeginInvoke(() => { usernameBox.Focus(); });
}
尝试调用我的自定义焦点设置函数(FocusEx)。
internal static class ControlExt
{
// Extension for Control
internal static bool FocusEx(this Control control)
{
if (control == null)
return false;
bool success = false;
if (control == FocusManager.GetFocusedElement())
success = true;
else
{
// To get Focus() to work properly, call UpdateLayout() immediately before
control.UpdateLayout();
success = control.Focus();
}
ListBox listBox = control as ListBox;
if (listBox != null)
{
if (listBox.SelectedIndex < 0 && listBox.Items.Count > 0)
listBox.SelectedIndex = 0;
}
return success;
}
}
这应该对你有用。
吉姆·麦卡迪