模态窗口中的DialogResult错误

时间:2014-10-04 12:02:04

标签: c# showdialog dialogresult

好的,这个将是一个有趣的。我正在我的应用程序中构建身份验证流程。我的应用程序将打开一个带有webbrowser元素的模态窗口并浏览到auth URL。然后它将监视webbrowser元素的URL更改以获取特定字符串。当它找到字符串时,它会检索访问代码,关闭窗口然后将代码返回给父代。我的代码如下:

模态窗口:

public partial class Browser : Window
{
    private string code = "";
    private Uri navi;

    public TwitchBrowser(Uri url)
    {
        InitializeComponent();
        this.navi = url;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        webBrowser.Navigate(this.navi);
        webBrowser.Navigating += webBrowser_Navigating;
    }

    void webBrowser_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        if (e.Uri.ToString().Contains("?code="))
        {
            this.code = e.Uri.ToString().Split('?')[1].Split('&')[0].Replace("code=", "");
            this.DialogResult = true;
        }
    }

    public string result
    {
        get { return code; }
    }
}

来自父母的电话:

string url = ...

Browser browser = new Browser(new Uri(url));
browser.Owner = parent;

if (browser.ShowDialog() == true)
{
    password.Password = browser.result;
    ...
}

当然,我得到的错误:

  

只有在创建Window并显示为对话框后才能设置DialogResult。

有趣的是,该应用程序工作!它获取代码并将其存储在密码字段中。那么错误的重点是什么?我的意思是,我知道我可以用Try-Catch压制它;但我担心这是一个更大问题的根源。

1 个答案:

答案 0 :(得分:1)

原始代码在那里有竞争条件。您正在浏览器的创建中导航。在调用ShowDialog()之前,可以触发导航完成。

而是隐藏私有变量中的url并在Loaded事件中设置WebBrowser。

现在你已经解决了这个问题,我猜你希望Nagivated事件而不是Navigating事件检查返回的URI。

Navigating事件发出错误仍然很有趣。我可以通过单击表单上的按钮来重现它,所以我知道表单在那时完全显示。