我试图在VB.Net WPF应用程序中编写一个函数,用于在MS WebBrowser控件中检索文档的高度。我只能在一段时间后呈现页面时才能获得此值。所以,我试过了:
Private Function GetHeight(ByVal htmlstring As String) As Integer
Dim wb As New WebBrowser 'Declare WebBrowser
wb.Width = 940 'set Width
wb.NavigateToString(htmlstring) 'Navigate to content
Do Until wb.IsLoaded 'Wait until page is rendered
Loop
'Get DOM Document
Dim doc As mshtml.HTMLDocument = wb.Document
'Get sought value
Dim RetVal As Integer = CInt(doc.body.getAttribute("scrollHeight").ToString)
doc = Nothing : wb.Dispose() : wb = Nothing 'Free variables
Return RetVal 'Return value
End Function
但调用此类函数会导致应用程序冻结。我该怎么办?我是否需要实现Async和Await关键字,以及Threading.Tasks以及如何实现这一目标?
答案 0 :(得分:1)
根据MSDN,IsLoaded是一个框架元素属性,指示是否已加载控件以进行演示,不是否已加载WebBrowser控件的网页。
虽然我质疑你为什么要实例化浏览器并让它导航到名为" GetHeight"的方法中的页面...我认为你想在这里做的是订阅LoadCompleted事件:{ {3}}
也许你可以构建你的webbrowser并让它以不同的方法导航,并使用你的GetHeight方法订阅LoadCompleted事件?
编辑我忽略了这一点,因为你在xaml之外声明了你的浏览器控件,所以永远不会加载控件(因此导航无法工作),因为它是不在WPF应用程序的可视化树中。您必须使用已在xaml中声明的webbrowser(我建议使用),或者使用以下内容以编程方式添加它:
<Window x:Class="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">
<StackPanel x:Name="MainPanel">
<Button Click="Button_Click"> Clicky</Button>
</StackPanel>
Class MainWindow
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
Dim wb As New WebBrowser 'Declare WebBrowser
wb.Width = 940 'set Width
Me.MainPanel.Children.Add(wb)
wb.NavigateToString("www.stackoverflow.com")
AddHandler wb.LoadCompleted, Sub(s, ee) DoSomething()
End Sub
Private Sub DoSomething()
MessageBox.Show("blah")
End Sub
结束班