好的,这个将是一个有趣的。我正在我的应用程序中构建身份验证流程。我的应用程序将打开一个带有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压制它;但我担心这是一个更大问题的根源。
答案 0 :(得分:1)
原始代码在那里有竞争条件。您正在浏览器的创建中导航。在调用ShowDialog()
之前,可以触发导航完成。
而是隐藏私有变量中的url
并在Loaded
事件中设置WebBrowser。
现在你已经解决了这个问题,我猜你希望Nagivated
事件而不是Navigating
事件检查返回的URI。
Navigating事件发出错误仍然很有趣。我可以通过单击表单上的按钮来重现它,所以我知道表单在那时完全显示。