我想在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和如何实现?
感谢您的回答。它确实有帮助。的确,我必须将WebBrowser添加到Visual Tree中;否则它不会导航。 顺便说一句,我通过在循环内插入Forms.Application.DoEvents()来解决我的另一个问题,并设法从函数返回整数值。 您的问题“为什么我需要建立WebBrowser并从函数返回其高度”的答案如下: 我需要以给定宽度调整iframe的高度,使iframe适合其内容。 – Zagavarr
@ Zagavarr,'DoEvents'是一个糟糕的禁忌。这个答案是一条更好的路线。 – OneFineDay
@Rowbear,'DoSomething'方法应该是一个'Sub',因为它不需要或不需要返回任何东西。 – OneFineDay