【问题标题】:DialogResult Error in a Modal Window模态窗口中的 DialogResult 错误
【发布时间】:2014-11-29 07:39:15
【问题描述】:

好的,这会很有趣。我正在我的应用程序中构建身份验证流程。我的应用程序将打开一个带有 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 压制它;但恐怕这是更大问题的根源。

【问题讨论】:

    标签: c# showdialog dialogresult


    【解决方案1】:

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

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

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

    有趣的是,导航事件给出了这个错误。我可以通过单击表单的按钮来重现它,因此我知道该表单已完全显示。

    【讨论】:

    • 实际上,不,它没有用。仍然收到错误。
    • 你为什么要检查navigating事件的代码?你不应该使用navigated 事件吗?
    • 这样就解决了!切换到导航事件解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-01-18
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多