如何在函数内等待事件?

时间:2015-10-20 22:38:44

标签: wpf vb.net webbrowser-control

我试图在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 个答案:

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

结束班