2011-08-22 99 views
3

什麼時候WPF webbrowser的LoadCompleted事件觸發? 此事件是否等待任何ajax調用在aspx頁面中完成。WPF webbrowser的LoadCompleted事件

我有一個wpf應用程序,其中一個webbrowser控件放置在窗體窗體和使用Navigate方法加載的網頁上。即使某些Ajax調用未初始化/等待,LoadCompleted事件也會觸發。

請建議在加載網頁100%(包括所有ajax調用)後觸發的任何事件。

+0

無法觀察腳本代碼的執行情況。 –

回答

0

documentation for the LoadComplete event狀態:

當正在導航的文件完成下載時發生。

這意味着當url完成下載時它會觸發。它並不意味着任何參考項目將觸發事件(圖像,腳本等)。另外,除非您將JavaScript引擎本身(我不知道您是否可以這樣做)掛鉤,以便在調用返回到Web服務器時收到通知,否則不能保證它是Ajax呼叫;圍繞這些調用沒有標準,通常針對Ajax的調用在您使用的各種庫中都不相同。

例如jQuery使用ajax() method,而scriptalicious在內部包裝調用,並沒有讓您直接調用Ajax調用。

或者,您可以直接使用XMLHttpRequest對象撥打電話。

即使您可以使用XMLHttpRequest縮小調用範圍,您也不知道哪些調用適用於Ajax;可以調用的URL並不表示它們是否是Ajax,也不表示返回的內容類型(純文本,XML,JSON)。

-2

如果您瞭解.NET Web模型的下一頁生命週期,您將獲得更大的圖片。

  1. Page_PreInit
  2. 列表項
  3. Page_Init
  4. Page_InitComplete
  5. Page_PreLoad
  6. 的Page_Load
  7. 控制活動
  8. Page_LoadComplete
  9. Page_PreRender
  10. SaveViewState
  11. Page_Render
  12. 激發Page_Unload
+4

這些是服務器端的ASP.Net事件,與這個問題無關。 –

1

我已經能夠解決這樣的問題。

你需要一些第三方組件:

  1. FiddlerCore:將作爲一個HTTP代理,內嵌在應用程序中
  2. Awesomium.net:WebBrowser控件,與鉻引擎的工作原理。我選擇這個引擎,因爲它允許爲應用程序指定一個代理服務器。

正如你所猜想的那樣,這個想法是創建一個內存代理服務器,並將您的Web瀏覽器控件重定向到該代理。

然後,FiddlerCore發佈一些事件,您可以在其中分析請求/響應,尤其是身體。

因爲它代理代理服務器,全部通信,包括Ajax調用,Flash調用等,由代理路由。

如果它可以幫助,一個小代碼,幫助我爲原型此行爲:

App.cs:

/// <summary> 
/// Interaction logic for App.xaml 
/// </summary> 
public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     BootStrap(); 
     base.OnStartup(e); 
    } 

    private void BootStrap() 
    { 
     SetupInternalProxy(); 
     SetupBrowser(); 
    } 

    private static void SetupBrowser() 
    { 
     // We may be a new window in the same process. 
     if (!WebCore.IsRunning) 
     { 
      // Setup WebCore with plugins enabled. 
      WebCoreConfig config = new WebCoreConfig 
      { 
       ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(), 
       EnablePlugins = true, 
       SaveCacheAndCookies = true 
      }; 
      WebCore.Initialize(config); 
     } 
     else 
     { 
      throw new InvalidOperationException("WebCore should be already running"); 
     } 
    } 

    private void SetupInternalProxy() 
    { 
     FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete; 
     FiddlerApplication.Log.OnLogString += (o, s) => Debug.WriteLine(s); 

     FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default; 
     //this line is important as it will avoid changing the proxy for the whole system. 
     oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy); 

     FiddlerApplication.Startup(
      0, 
      oFCSF 
      ); 
    } 

    private void FiddlerApplication_AfterSessionComplete(Session oSession) 
    { 
     Debug.WriteLine(oSession.GetResponseBodyAsString()); 
    } 
} 

MainWindow.xaml:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:Custom="http://schemas.awesomium.com/winfx" 
     x:Class="WpfApplication1.MainWindow" 
     Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded"> 
    <Grid> 

     <Custom:WebControl Name="browser"/> 

    </Grid> 
</Window> 

最後,主窗口.xaml.cs:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     browser.LoadURL("http://google.fr"); 
    } 
} 

您必須爲此應用程序添加一些管道,以便將應用程序的請求路由和分析到業務類,但這超出了此問題的範圍。