0

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

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

这是一个示例,说明了我在说什么。


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

xml:

<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如果我在后面输入代码,有没有办法让事件触发?

4

3 回答 3

3

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

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

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

于 2013-03-06T23:14:51.870 回答
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!");
}

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

于 2013-03-07T03:02:36.857 回答
1
        MyWebClient client = new MyWebClient();
        client.DownloadStringCompleted += new MyWebClient.DownloadStringCompletedEventHandler(HandleDownloadStringCompleted);

    // call the async method
        client.DownloadStringAsync(url, handler);
于 2013-03-06T23:28:07.743 回答