2014-01-13 5 views
2

Я видел несколько потоков в StackOverflow по этой теме, однако ни один из них, похоже, не дает ответа.C# WPF - Ожидание загрузки страницы

У меня есть кнопка, которая при нажатии открывается невидимая веб-страница, перемещается по URL-адресу, вводит информацию в поле, нажимает кнопку, а затем выводит на экран информацию.

Кости моего кода в основном в щелчку:

WebBrowser wb = new WebBrowser; 
wb.Visibility = System.Windows.Visibility.Hidden; 
wb.Navigate("http://somepage.com"); 

И это, где это становится сложнее.

Я ищу способ обеспечить, что страница загружается, прежде чем пытаться ввести данные или очистить экран. Я видел несколько тем, которые говорят о Navigated, IsLoaded, LoadCompleted, а также BackgroundWork, но я не могу заставить их работать.

Какой вариант лучше всего использовать для определения того, что страница полностью загружена? Как бы вы выбрали выбранный метод?

Я также не могу получить данные с экрана, так как WPF не использует то же самое GetElementByID.

Edit:

Per комментарий ниже, вот ошибки я бегу в:

  • навигацию, первым, как только страница была навигация тоже и вовсе не обязательно ждать, пока все объекты загружены. Это работает по назначению, но не может использоваться для моих целей.
  • IsLoaded никогда не возвращает истину

    private void GetData_Click(object sender, RoutedEventArgs e) 
    { 
        int x=0; 
        HTMLDocument doc; 
    
        wb = new WebBrowser(); 
        wb.Visibility = System.Windows.Visibility.Visible; 
        wb.Navigate("somesite.com"); 
    
        doc = wb.Document as mshtml.HTMLDocument; 
    
        while(!wb.IsLoaded) 
        { 
        //Wait 
        } 
    
        doc.getElementById("txt_One").innerText = "It Worked"; 
    
    } 
    

Кладет его в бесконечном цикле, как wb не кажется, никогда не загружать.

  • Это версия с LoadCompleted

событие 'System.Windows.Controls.WebBrowser.LoadCompleted' может появиться только на левой стороне + = или - =

private void GetData_Click(object sender, RoutedEventArgs e) 
    { 
     int x=0; 
     HTMLDocument doc; 

     wb = new WebBrowser(); 
     wb.Visibility = System.Windows.Visibility.Visible; 
     wb.Navigate("somesite.com"); 

     doc = wb.Document as mshtml.HTMLDocument; 

     wb.LoadCompleted += wb_LoadCompleted; 

     doc.getElementById("txt_One").innerText = "It Worked"; 

    } 

    void wb_LoadCompleted(object sender, NavigationEventArgs e) 
    { 

    } 

Выдает ошибку

Необработанное исключение типа «System.NullReferenceException» произошло в {filename}

Дополнительная информация: Ссылка на объект не установлена ​​в экземпляр объекта.

+2

Просьба уточнить, что «не может заставить их работать». Покажите свой код, опишите проблему с каждой попыткой более подробно. Мы не можем сказать вам, почему это не работает, не видя никакого кода. – tnw

+0

Спасибо за ваше редактирование ... но пожалуйста ** покажите свой код **. – tnw

ответ

6

управления WebBrowser имеет loadedevent (который есть): LoadCompleted: пожары, когда дом полностью загружен.

Привязать событие и в методе события получить документ, а не сразу.

//root is a grid element identified in the XAML 
    public WebBrowser webb; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     webb = new WebBrowser(); 
     webb.Visibility = System.Windows.Visibility.Hidden; 
     root.Children.Add(webb); 
     webb.LoadCompleted += webb_LoadCompleted; 
     webb.Navigate("http://www.google.com"); 
    } 

    void webb_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     MessageBox.Show("Completed loading the page"); 

     mshtml.HTMLDocument doc = webb.Document as mshtml.HTMLDocument; 
     mshtml.HTMLInputElement obj = doc.getElementById("gs_taif0") as mshtml.HTMLInputElement; 
     mshtml.HTMLFormElement form = doc.forms.item(Type.Missing, 0) as mshtml.HTMLFormElement; 

     webb.LoadCompleted -= webb_LoadCompleted; //REMOVE THE OLD EVENT METHOD BINDING 
     webb.LoadCompleted += webb_LoadCompleted2; //BIND TO A NEW METHOD FOR THE EVENT 
     obj.value = "test search"; 
     form.submit(); //PERFORM THE POST ON THE FORM OR SEARCH 
    } 

    //SECOND EVENT TO FIRE AFTER YOU POST INFORMATION 
    void webb_LoadCompleted2(object sender, NavigationEventArgs e) 
    { 
     MessageBox.Show("Completed loading the page second time after post"); 
    } 

Необходимо выполнить doc = wb.Document как mshtml.HTMLDocument; в событии, заполненном загрузкой. Поскольку пока загрузка не будет завершена, вы не сможете получить документ.

+0

webb_Navigated get уволен, как указано. Тем не менее, ничего в webb_LoadCompleted не получилось. Я удалил все, кроме сообщений, в области webb_loadcompleted, и ничего не происходит. – user3175176

+0

Я проверил быстрый тест, и похоже, если элемент управления никогда не помещается в окно, он никогда не срабатывает. Попробуйте что-то вроде этого: webb.Visibility = System.Windows.Visibility.Hidden; root.Children.Add (webb); Где root - имя элемента сетки. – user2453734

+0

Я сделал то, что вы сказали, и смог заставить его работать. Есть ли способ сделать это рекурсивно? Например, когда я доберусь до исходной страницы, введите критерии поиска и нажмите «Ввод». Я попытался добавить новый компонент Navigated и LoadCompleted, но ни один из них не срабатывает из компонента webb_LoadCompleted. – user3175176

 Смежные вопросы

  • Нет связанных вопросов^_^