0

好的,这将是一个有趣的。我正在我的应用程序中构建身份验证流程。我的应用程序将打开一个带有 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;
    ...
}

当然,我得到的错误是:

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

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

4

1 回答 1

1

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

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

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

导航事件给出该错误仍然很有趣。我可以通过单击表单的按钮来重现它,因此我知道该表单在那时已完全显示。

于 2014-10-04T12:19:09.360 回答