模态窗口中的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事件给出该错误仍然很有趣。我可以通过单击表单上的按钮来重现它,所以我知道该表单完全显示在该点上。
谢谢!这工作。 – 2014-10-04 12:28:09
其实,不行,它不起作用。仍然收到错误。 – 2014-10-04 12:33:04
我已经更新了OP中的代码来表示我当前的代码。 – 2014-10-04 12:38:44