2014-10-04 4 views
0

오케이,이 것은 재미있을 것입니다. 내 응용 프로그램에 인증 흐름을 구축하고 있습니다. 내 응용 프로그램은 webbrowser 요소가있는 모달 창을 열고 인증 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를 설정하십시오.

이제 문제를 해결 했으므로 Navigating 이벤트 대신 Nagivated 이벤트를 사용하여 반환 된 URI를 확인하고 싶습니다.

Navigating 이벤트가 오류를 발생시키는 것은 여전히 ​​흥미 롭습니다. 버튼을 클릭하여 양식을 재현 할 수 있었기 때문에 양식이 완전히 표시되었음을 알 수 있습니다.

+0

감사합니다. 그게 효과가 있었어. –

+0

사실, 아뇨, 작동하지 않았습니다. 오류가 계속 발생합니다. –

+0

현재 코드를 나타 내기 위해 OP 코드를 업데이트했습니다. –