2014-10-04 55 views
0

好的,這個會很有趣。我在我的應用程序中構建一個身份驗證流程。我的應用程序將打開一個帶有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壓制它;但我擔心它是一個更大問題的根源。

回答

1

你原來的代碼在那裏有一個競爭條件。您正在導航創建瀏覽器。在您撥打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