Windows 10 UWP MessageDialog 在等待结果后调用方法两次
Windows 10 UWP MessageDialog calls method twice after awaiting result
真的不知道在标题中描述问题的最佳方式。我有一个 Windows 10 UWP。我基本上想做的就是检查用户何时 select 使用另一个文本框,确保前一个文本框不为空。换句话说,它类似于登录字段,我希望他们在输入密码之前先输入用户名,因此,如果他们 select 将焦点放在密码字段中,同时将用户名留空,我会弹出一个消息来警告他们并强制将焦点返回到用户名字段。这是我的代码:
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();
然后它停下来等待,就像我认为的那样,直到我在消息对话框上 select "Okay"。
然后我在消息对话框中 select "Okay" 并从头开始调用整个方法。这会导致消息框再次显示,第二次。
虽然这本身是不可取的,但在那之后我要么间歇性地得到一个异常,比如这个:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
或者它将第二次按预期工作(如果我没有遇到上述异常)并且消息框将消失,让我专注于用户想要的字段。
所以,根本原因是该方法被调用了两次,第一次是当我确实像预期的那样失去焦点时,然后在我单击 "Okay" 并且等待完成后再次调用。
知道为什么会这样吗?
谢谢!
显示消息框时,密码框失去焦点。当消息框关闭时,密码框会再次获得焦点,触发事件。
有几种方法可以解决这个问题。
最简单的方法可能是在显示消息框之前将焦点设置到用户输入框。
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();
}
}
真的不知道在标题中描述问题的最佳方式。我有一个 Windows 10 UWP。我基本上想做的就是检查用户何时 select 使用另一个文本框,确保前一个文本框不为空。换句话说,它类似于登录字段,我希望他们在输入密码之前先输入用户名,因此,如果他们 select 将焦点放在密码字段中,同时将用户名留空,我会弹出一个消息来警告他们并强制将焦点返回到用户名字段。这是我的代码:
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();
然后它停下来等待,就像我认为的那样,直到我在消息对话框上 select "Okay"。
然后我在消息对话框中 select "Okay" 并从头开始调用整个方法。这会导致消息框再次显示,第二次。
虽然这本身是不可取的,但在那之后我要么间歇性地得到一个异常,比如这个:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
或者它将第二次按预期工作(如果我没有遇到上述异常)并且消息框将消失,让我专注于用户想要的字段。
所以,根本原因是该方法被调用了两次,第一次是当我确实像预期的那样失去焦点时,然后在我单击 "Okay" 并且等待完成后再次调用。
知道为什么会这样吗?
谢谢!
显示消息框时,密码框失去焦点。当消息框关闭时,密码框会再次获得焦点,触发事件。
有几种方法可以解决这个问题。
最简单的方法可能是在显示消息框之前将焦点设置到用户输入框。
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();
}
}