并不知道在标题中描述问题的最佳方法。我有一个Windows 10 UWP。我基本上要做的就是检查用户何时选择另一个文本框,前一个文本框不为空。换句话说,它类似于登录字段,我希望他们在密码之前首先输入用户名,因此,如果他们选择将焦点放在密码字段中,同时将用户名留空,我会弹出一条消息来警告他们这个和强制焦点回到用户名字段。这是我的代码:
private async void TbPassword_GotFocus(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(tbUser.Text))
{
var md = new MessageDialog("Please specify a user first. ",
"Enter UserName");
md.Commands.Add(new UICommand("Okay")
{
});
var result = await md.ShowAsync();
if (result.Label == "Okay")
{
tbUser.Focus(FocusState.Programmatic);
}
}
else
{
preCheckUser();
}
}
我遇到的问题是每次都会调用两次TbPassword_GotFocus。设置断点时,我看到的就是这个。
当我第一次改变焦点时,方法会被调用,它会到达行
var result = await md.ShowAsync();
它停止并在我认为它应该等待那里,直到我选择"好的"在消息对话框中。
然后我选择"好的"在消息对话框中,从头开始再次调用整个方法。这会导致消息框再次显示。
虽然这本身是不可取的,但在此之后我会间歇性地得到例如这样的例外:
访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))
或者它会第二次按预期工作(如果我没有得到上述异常)并且消息框将消失,让我将焦点放在我想要的字段中,供用户使用。
所以,根本原因是被调用两次的方法,首先是当我按预期失去焦点但是在我点击了#34之后再次调用#Ok;"等待已经完成。
为什么会发生这种情况?
谢谢!
答案 0 :(得分:3)
当您显示消息框时,密码框将失去焦点。当消息框关闭时,密码框会再次获得焦点,从而触发事件。
有几种方法可以解决这个问题。
最简单的可能是在显示消息框之前将焦点设置到用户输入框。
private async void TbPassword_GotFocus(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(tbUser.Text))
{
tbUser.Focus(FocusState.Programmatic);
var md = new MessageDialog("Please specify a user first. ",
"Enter UserName");
md.Commands.Add(new UICommand("Okay")
{
});
await md.ShowAsync();
}
else
{
preCheckUser();
}
}