使用后面的代码加载一个网页

本文关键字:一个 网页 加载 代码 | 更新日期: 2023-09-27 18:02:34

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

但我注意到,WebBrowser必须在Xaml中创建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在代码后面?

使用后面的代码加载一个网页

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

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

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

代码隐藏浏览器没有加载的原因是它不在可视树中:它没有被放入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!");
}

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

        MyWebClient client = new MyWebClient();
        client.DownloadStringCompleted += new MyWebClient.DownloadStringCompletedEventHandler(HandleDownloadStringCompleted);
    // call the async method
        client.DownloadStringAsync(url, handler);