使用后面的代码加载一个网页
本文关键字:一个 网页 加载 代码 | 更新日期: 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);