使用代码加载网页

时间:2013-03-06 23:03:12

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

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

但我注意到必须在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,有没有办法让事件发生?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

代码隐藏浏览器未加载的原因是因为它不在Visual Tree中:它还没有被放入UI中。 Xaml可以工作,因为已经被放入Visual Tree中,因为它是在Xaml中创建的。

如果你想从代码创建浏览器然后让它工作,你需要把它放到Visual Tree中。例如:

<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!");
}

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

答案 2 :(得分:1)

        MyWebClient client = new MyWebClient();
        client.DownloadStringCompleted += new MyWebClient.DownloadStringCompletedEventHandler(HandleDownloadStringCompleted);

    // call the async method
        client.DownloadStringAsync(url, handler);