模态窗口中的DialogResult错误

问题描述:

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

模态窗口:

string url = ... 

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

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

和当然,错误,我得到:

的DialogResult

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

从父调用只有在创建窗口并显示为对话框后才能设置。

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

你原来的代码在那里有一个竞争条件。您正在导航创建浏览器。在您拨打ShowDialog()之前,导航完成可能会被触发。

取而代之将url保存在一个私有变量中,并在您的Loaded事件中设置WebBrowser。

现在你已经修复了这个问题,我猜你想要Nagivated事件而不是Navigating事件来检查返回的URI。

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

+0

谢谢!这工作。 – 2014-10-04 12:28:09

+0

其实,不行,它不起作用。仍然收到错误。 – 2014-10-04 12:33:04

+0

我已经更新了OP中的代码来表示我当前的代码。 – 2014-10-04 12:38:44