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 每次都被调用两次。设置断点时,这是我看到的情况。

  1. 当我第一次改变焦点时,该方法被调用并到达行

      var result = await md.ShowAsync();
    

然后它停下来等待,就像我认为的那样,直到我在消息对话框上 select "Okay"。

  1. 然后我在消息对话框中 select "Okay" 并从头开始调用整个方法。这会导致消息框再次显示,第二次。

  2. 虽然这本身是不可取的,但在那之后我要么间歇性地得到一个异常,比如这个:

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();
    }
 }