等待结果后,Windows 10 UWP MessageDialog调用方法两次

时间:2017-01-17 23:47:21

标签: c# uwp win-universal-app windows-10-universal windows-10-mobile

并不知道在标题中描述问题的最佳方法。我有一个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。设置断点时,我看到的就是这个。

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

      var result = await md.ShowAsync();
    
  2. 它停止并在我认为它应该等待那里,直到我选择"好的"在消息对话框中。

    1. 然后我选择"好的"在消息对话框中,从头开始再次调用整个方法。这会导致消息框再次显示。

    2. 虽然这本身是不可取的,但在此之后我会间歇性地得到例如这样的例外:

    3.   

      访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

      或者它会第二次按预期工作(如果我没有得到上述异常)并且消息框将消失,让我将焦点放在我想要的字段中,供用户使用。

      所以,根本原因是被调用两次的方法,首先是当我按预期失去焦点但是在我点击了#34之后再次调用#Ok;"等待已经完成。

      为什么会发生这种情况?

      谢谢!

1 个答案:

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