【问题标题】:Load a web page using code behind使用后面的代码加载网页
【发布时间】:2013-03-06 23:03:11
【问题描述】:

我有一个场景,我从我公司的一个内部网页面中抓取一些值。我不打算在我的应用程序中显示该页面。我只需要网页中的一些数据。

但我注意到必须在 Xaml 中创建 WebBrowser 才能触发 LoadComplete 事件。由于我不打算显示网页,因此我宁愿不在 Xaml 中创建它。

这里有一个例子来说明我在说什么。


Xaml 版本(事件触发良好):

Xaml:

<WebBrowser x:Name="webBrowser" Visibility="Collapsed"/>    

代码:

public MainWindow()
{
    InitializeComponent();

    webBrowser.LoadCompleted += WebBrowserOnLoadCompleted;
    webBrowser.Navigate("http://stackoverflow.com/");
}

private void WebBrowserOnLoadCompleted(object sender, NavigationEventArgs navArgs)
{
    MessageBox.Show("PageLoaded");
}

结果:然后 MessageBox 显示。 (事件触发)


仅代码版本(事件不会触发):

代码:

public MainWindow()
{
    InitializeComponent();

    WebBrowser codeBehindBrowser = new WebBrowser();
    codeBehindBrowser.LoadCompleted += WebBrowserOnLoadCompleted;
    codeBehindBrowser.Navigate("http://stackoverflow.com/");
}

private void WebBrowserOnLoadCompleted(object sender, NavigationEventArgs navArgs)
{
    MessageBox.Show("PageLoaded");
}

结果:事件没有触发。


如果我在后面的代码中设置WebBrowser,有没有办法触发事件?

【问题讨论】:

    标签: c# .net wpf xaml webbrowser-control


    【解决方案1】:

    如果不需要显示页面,最好使用WebClient

    WebClient client = new WebClient();
    //client.Credentials = new NetworkCredential("username", "password");
    string reply = client.DownloadString(address);
    

    还有一个DownloadStringAsync方法,不会阻塞UI

    【讨论】:

    • 这是获取数据的好方法。但它以字符串的形式返回。我的其余代码需要一个 IHTMLDocument2 才能使用(或者至少我可以使用 xml 进行搜索)。 WebBrowser.Document 可以轻松转换为 IHTMLDocument2。
    • HtmlAgilityPack 让我可以使用 xpath 查询我的数据。谢谢您的帮助!这有效并且速度更快(因为它没有渲染它)
    【解决方案2】:

    代码隐藏浏览器不加载的原因是它不在可视树中:它没有被放入 UI。 Xaml 之所以有效,是因为它被放入可视化树中,仅仅是因为它是在 Xaml 中创建的。

    如果您想从代码创建浏览器,那么为了让它工作,您需要将它放入可视树中。例如:

    <Window x:Class="WebBrowserLoadTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid x:Name="LayoutRoot"/>
    </Window>
    
    public MainWindow()
    {
        InitializeComponent();
    
        WebBrowser codeBehindBrowser = new WebBrowser { Visibility = Visibility.Collapsed };
        codeBehindBrowser.LoadCompleted += CodeBehindBrowserOnLoadCompleted;
        codeBehindBrowser.Navigate("http://stackoverflow.com/");
        this.LayoutRoot.Children.Add(codeBehindBrowser);
    }
    
    private void CodeBehindBrowserOnLoadCompleted(object sender, NavigationEventArgs e)
    {
        MessageBox.Show("CodeBehindBrowser loaded, yay!");
    }
    

    只要它以某种方式插入到可视树中,它就可以工作。

    【讨论】:

      【解决方案3】:
              MyWebClient client = new MyWebClient();
              client.DownloadStringCompleted += new MyWebClient.DownloadStringCompletedEventHandler(HandleDownloadStringCompleted);
      
          // call the async method
              client.DownloadStringAsync(url, handler);
      

      【讨论】:

        猜你喜欢
        • 2019-09-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多