2015-10-20 35 views
0

我想在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和如何实现?

回答

1

根据MSDN,IsLoaded是一个框架元素属性,用于指示控件是否已加载用于演示文稿,而不是 WebBrowser控件的网页是否已加载。

当我问你为什么会实例化一个浏览器,并把它定位到一个名为“GETHEIGHT等到”方法的网页...我想你想在这里做的是订阅LoadCompleted事件:https://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted(v=vs.110).aspx

也许你可以构建你的web浏览器并使用不同的方法导航,并使用GetHeight方法订阅LoadCompleted事件?

编辑我忘了提,因为你宣布XAML以外浏览器控件,该控件将永远不会被加载(因此,navgiation将无法正常工作),因为它不是在WPF应用程序的可视化树。你必须要么使用在XAML(这我会建议)已经宣布一个网页浏览器,或以编程方式像这样的东西添加:

<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> 

类主窗口

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 

结束

+0

感谢您的回答。它确实有帮助。的确,我必须将WebBrowser添加到Visual Tree中;否则它不会导航。 顺便说一句,我通过在循环内插入Forms.Application.DoEvents()来解决我的另一个问题,并设法从函数返回整数值。 您的问题“为什么我需要建立WebBrowser并从函数返回其高度”的答案如下: 我需要以给定宽度调整iframe的高度,使iframe适合其内容。 – Zagavarr

+0

@ Zagavarr,'DoEvents'是一个糟糕的禁忌。这个答案是一条更好的路线。 – OneFineDay

+1

@Rowbear,'DoSomething'方法应该是一个'Sub',因为它不需要或不需要返回任何东西。 – OneFineDay