2016-10-04 8 views
0

У меня проблема с элементом управления WebBrowser. Я добавил его в одно из окон, но он не загружает страницу, к которой я перехожу. Я хочу получить доступ к управлению из других окон, поэтому я сделал общедоступные методы, такие как Навигация и т. Д. Я попытался добавить WebBrowser в другие формы и, похоже, работает нормально. Он работал над этим окном, когда он был без какого-либо добавленного кода. Я использую AutoResetEvent, поэтому, когда загрузка сайта будет продолжена, программа продолжит работу. Может ли кто-нибудь сказать мне, где может быть проблема в этом коде?WPF WebBrowser не загружается

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 
    readonly AutoResetEvent thread1Step = new AutoResetEvent(false); 
    public void EnterForm(string ElementId, string value) 
    { 
     HTMLDocument document = (HTMLDocument)TempBrowser.Document; 
     document.getElementById(ElementId).innerText = value; 
    } 
    public void Navigate(string url) 
    { 
     TempBrowser.Navigate(url); 
     thread1Step.WaitOne(); 
     thread1Step.Reset(); 
    } 
    public void PressButton(string id) 
    { 
     HTMLDocument doc = (HTMLDocument)TempBrowser.Document; 
     IHTMLElement btn = doc.getElementById(id); 
     if (btn != null) 
     { 
      btn.click(); 
     } 
    } 
    public void Scroll(int n) 
    { 
     HTMLDocument doc = (HTMLDocument)TempBrowser.Document; 
     doc.parentWindow.scroll(0, n); 
    } 
    private void TempBrowser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) 
    { 
     thread1Step.Set(); 
    } 
    public void CallFunction(string Funct) 
    { 
     TempBrowser.InvokeScript(Funct); 

    } 
} 
+0

Вы блокируете поток, который выполняет навигацию с помощью 'thread1Step.WaitOne();'. Так что LoadCompleted никогда не может быть вызван ... См. Например, http://stackoverflow.com/a/20958546/932418 (Это образец WinForm, но его можно легко преобразовать в WPF) –

+0

@LB Я использую потоки для первого времени, но мне как-то удалось заставить ваш код работать в WPF. Но моя главная проблема по-прежнему сохраняется. 'WebBrowser' не загружается, поэтому каждый раз, когда я пытаюсь получить документ от него, документ имеет значение NULL. –

ответ

0

Я подготовил код асинхронной для WPF на основе моего друга answer ...

public static class MyExtensions 
{ 
    public static Task NavigateAsync(this WebBrowser browser, Uri uri) 
    { 
     var tcs = new TaskCompletionSource<object>(); 
     LoadCompletedEventHandler loadCompleted = null; 

     loadCompleted = (s, e) => 
     { 
      browser.LoadCompleted -= loadCompleted; 
      tcs.SetResult(e.WebResponse); 
     }; 

     browser.LoadCompleted += loadCompleted; 
     browser.Navigate(uri); 

     return tcs.Task; 
    } 
} 

Теперь вы можете удалить thread1Step и TempBrowser_LoadCompleted метода. Просто используйте

await TempBrowser.NavigateAsync(url); 
DoYourWork(); //At this point your page is loaded. Read its content... 
Смежные вопросы