首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF网页浏览器的LoadCompleted事件

WPF网页浏览器的LoadCompleted事件
EN

Stack Overflow用户
提问于 2011-08-22 18:00:58
回答 3查看 5.5K关注 0票数 3

WPF浏览器的LoadCompleted事件什么时候会触发?此事件是等待aspx页面中完成的任何ajax调用。

我有一个wpf应用程序,其中一个wpf浏览器控件放置在窗口窗体和一个网页加载使用导航方法。即使在一些ajax调用未初始化/等待时,LoadCompleted事件仍会触发。

请建议任何事件后,加载100%的网页火灾,包括所有ajax调用。

EN

回答 3

Stack Overflow用户

发布于 2012-07-19 11:56:32

我已经解决了这个问题。

你将需要一些第三方大会:

  1. FiddlerCore:将充当嵌入应用程序中的http代理。
  2. Awesomium.net:一个用于铬引擎的WebBrowser控件。我选择这个引擎,因为它允许只为应用程序指定代理服务器。

正如您所猜测的,这样做的目的是创建内存中的代理服务器,并将web浏览器控件重定向到此代理。

然后,FiddlerCore发布一些事件,您可以在其中分析请求/响应,特别是主体。

作为代理,所有的通信,包括Ajax调用、Flash等,都由代理路由。

如果可以的话,一个小代码可以帮助我建立这个行为的原型:

App.cs:

代码语言:javascript
复制
/// <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:

代码语言:javascript
复制
<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>

最后,MainWindow.xaml.cs:

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

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

您必须为这个应用程序添加一些管道,以便将请求从应用程序路由和分析到业务类,但这超出了这个问题的范围。

票数 1
EN

Stack Overflow用户

发布于 2011-08-22 18:44:13

事件指出:

在被导航到已完成下载的文档时发生。

这意味着当下载url完成时,它将触发。这并不意味着任何引用的项都会触发事件(图像、脚本等)。

此外,除非您连接到JavaScript引擎本身(我不知道您是否可以这样做),否则在调用返回到web服务器时会收到通知,否则无法保证它是Ajax调用;调用没有标准,而且对Ajax的调用在您使用的各种库中通常是不同的。

例如,jQuery使用方法,而抄袭在内部包装调用,没有提供直接进行Ajax调用的方法。

或者,您可以直接使用XMLHttpRequest对象进行调用。

即使可以将其缩小到使用XMLHttpRequest的调用,您也不知道哪些调用是Ajax的;可以调用的URL并不表示它们是否是Ajax,也不表示返回的内容类型(纯文本、XML、JSON)。

票数 0
EN

Stack Overflow用户

发布于 2011-08-23 03:41:57

如果您了解.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
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7151535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档