【发布时间】:2014-07-13 18:30:43
【问题描述】:
我正在尝试从 WPF 应用程序创建 Internet Explorer 实例,加载保存的本地文件,并在加载文件后进行进一步处理。但是,尽管该文件在 Internet Explorer 窗口中可见,但 DocumentComplete 事件永远不会触发:
'static field
Dim iex As ShDocVw.InternetExplorer
Public Sub DoStuff()
Dim path = "c:\test.htm"
iex = New SHDocVw.InternetExplorer
iex.Visible = True
AddHandler iex.DocumentComplete, Sub(o As Object, ByRef url As Object)
'This code is never executed
Dim i = 5
End Sub
iex.Navigate2(path)
End Sub
当我导航到非本地 URL(例如 http://www.google.com)时,DocumentComplete 事件会触发。
NavigateComplete2 事件存在相同的行为。
我尝试使用 AddressOf 和 Handles 使用类成员方法而不是 lambda 表达式(也许 lambda 表达式在方法退出后超出范围?),但这没有帮助。
我必须做什么才能触发DocumentComplete 事件?
(注意:页面没有框架。)
更新
此代码正在类库中使用,因此我无法使用 WebBrowser 控件,因为它无法在代码中实例化。
正如 SimonMourier 在 cmets 中指出的那样,可以在代码中实例化 WebBrowser:
Dim wb = New WebBrowser
AddHandler wb.LoadCompleted, Sub(s, e)
Dim i = 5
End Sub
wb.Navigate(path)
虽然 LoadCompleted 事件仍然没有触发,但 Navigated 事件会触发,而且它似乎足以满足我的目的。 (显然,WebBrowser 必须是可见的才能 LoadCompleted 触发 - 请参阅here 和 here - 因为我没有在窗口的上下文中使用 WebBrowser,我认为这甚至是不可能的就我而言。)
【问题讨论】:
-
为什么不用WebBrowser控件?
-
@SimonMourier 我不需要在 WPF 窗口的上下文中定义/实例化 WebBrowser 吗?另外,根据您的经验,WebBrowser 不会有这个问题吗?
-
嗯,WebBrowser 正是为这种情况而设计的,是的,它支持(大多数)IE 事件。只有在需要访问本机接口(如 IHtmlDocument2 等)时才需要互操作。我建议你还是试试吧。
-
@SimonMourier 这是类库中的代码,我认为我没有办法从类库中实例化 WebBrowser。
-
WebBrowser 是一个可以在任何地方创建的类
标签: wpf vb.net ie-automation