2012-05-01 61 views
0

我正在冒險進入WPF - 第一次在(VB).NET中 - 並試圖重新創建一個項目,我開始使用MS Access VBA。它基本上是在Web應用程序中刪除一系列頁面。正如你可能已經猜測,我有LoadCompleted事件的麻煩。等待WebBrowser在多個Navigate()調用之間完全加載

我已經搜索並找到了它的一些信息,但代碼的「流」只適合等待一個頁面加載。例如:

http://social.msdn.microsoft.com/Forums/nn-NO/wpf/thread/52c1bc55-dd41-468c-8759-a42726635d4b

所有的代碼執行在DocumentLoaded事件時,你只需要導航到一個頁面並執行代碼工作正常運行。但我需要爲我的應用程序執行一系列這些循環。

我該如何可靠地等待文檔完全加載,同時仍然保持代碼執行在同一個Sub中,而不是鎖定UI線程?

下面是我想要做的一個基本想法。

  1. 導航頁
  2. 爲等待頁面完全加載
  3. 做的東西
  4. 導航頁
  5. 沖洗,重複

PS - .NET是非常新的我所以請不要讓我的大腦堆棧溢出;)

謝謝, 布賴恩

- ##編輯## -

這是我用VBA做。這正是我想要做的,只是在「.NET」的方式,而不會阻止用戶界面主題:

Dim oIE = New SHDocVw.InternetExplorer 

     With oIE 
      .Navigate(strURL) 
      .Visible = False 


      ' loop until the page finishes loading 
      Do While oIE.Busy : Loop 
      Do While oIE.ReadyState <> 4 : Loop 

      'Code goes here to read DOM, get fields and click a button (logging in to site) 
      'My code execution is done and now I'm ready to go to the next page and read the DOM 

      .Navigate(strURL) 

     End With 

。 。 。 。

就是這樣。重複n次。我與每個DOM的交互顯着不同。

回答

1

我只會在LoadCompleted處理程序的末尾再次調用Navigate。然後,我想,使用一個窗口範圍變量來跟蹤您的目標URL。

List<string> _urls; 
int _i = 0; 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    _urls = new List<string>() { url1, url2, url3 }; // URLs to navigate 
    webBrowser1.LoadCompleted += webBrowser1_LoadCompleted; 
    webBrowser1.Navigate(_urls[_i]); 
} 
void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
{ 
    // do stuff 

    i++; 
    var nextUrl = _urls[i]; 
    webBrowser1.Navigate(nextUrl); 
} 

編輯

也許這樣的事情會更適合。每個循環後,您可以設置下一個URL以及其處理程序。

class NavIteration 
{ 
    public string Url { get; set; } 
    public delegate void HandleResult(object sender, NavigationEventArgs e); 
    public HandleResult ResultHandler { get; set; } 
} 

NavIteration CurrentIteration; 

void setNextIteration() 
{ 
    CurrentIteration = null; 
    CurrentIteration = new NavIteration() { 
     Url = someurl, 
     ResultHandler = (sender, e) => { 
      // handle 
     } 
    }; 
} 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    webBrowser1.LoadCompleted += webBrowser1_LoadCompleted; 
    setNextIteration(); 
    webBrowser1.Navigate(); 
} 

void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e) 
{ 
    CurrentIteration.ResultHandler(sender, e); 
    setNextIteration(); 
    webBrowser1.Navigate(CurrentIteration.Url); 
} 
+0

dbaseman,謝謝你的回覆。不幸的是,我正在瀏覽的網址並不知道。換句話說,所需的URL數量和URL本身是在每個「循環」後都會動態生成的 – brian

+0

@brian gotcha。原則上不是這樣嗎?只需調用** getNextUrl()**的一些實現並離開你去? – McGarnagle

+0

啊,我明白了。你說我可以在列表中添加項目,因爲我正在迭代列表。但是我對每個URL的操作(代碼)是不同的。我只是要有一個巨大的SELECT..Case來處理每個URL?由於直到列表中的下一頁才知道URL,因此如何將瀏覽器當前URL與適當的代碼塊進行匹配?我希望我能夠清楚地問這個問題。我感謝你給我你的時間來幫助。謝謝。 – brian

0

也許我走了,但我會「做東西」在BackGroundWorker。讓主線程不做任何事情,但找到頁面。如果「做東西」比查找慢,然後找到下一個油門。

您是否考慮WebClient下載到字符串或字節數組,然後轉換爲DOM。你需要IE嗎?

+0

嗨Blam - 在這種情況下的「東西」是從瀏覽器DOM中抓取數據。我看不到BGW如何提供幫助。無論它運行什麼線程,都需要等待IE完全加載。不得不對WebBrowser進行多次調用,並將其全部轉儲到事件處理函數中,這對我來說是一個挑戰。 – brian

+0

@brian查看更新的答案。如果你看不到BGW上的東西會如何幫助,那麼我懷疑我可以幫助你。 – Paparazzi

+0

也許我只是不明白你的建議?我進入.NET 5天。所以在按鈕的點擊事件中,我編碼它以導航到頁面。然後「運行」一個BGW來閱讀頁面的dom。我仍然堅持同樣的問題。在瀏覽器完成加載之前,我無法開始閱讀DOM。這不是同時做兩件事的問題。它正在做一件事,並在我轉向下一件事之前得到確認,然後沖洗/重複。我不想在程序中鎖定我的應用程序,但在這一點上,我甚至不在乎它是否意味着讓它做我想做的事情。 – brian

相關問題