我有一个场景,我正在从我公司的一个内部网页中抓取一些值。我不打算在我的应用中显示该页面。我只需要网页上的一些数据。
但我注意到必须在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
,有没有办法让事件发生?
答案 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);