Visual Studio 2010,Visual Basic .NET
再次编辑 我已经确定我要做的事情是无法完成的。
我的表单frmContent
带有WebBrowser控件wbContent
。
如果单击wbContent中的图像链接,它将打开一个新表单(frmImages)并将图像加载到WebBrowser wbImages
中。我使用WebBrowser控件,因为我使用相同的窗口打开用html编写的表。
无论如何,当用户点击wbContent
中的表格链接时,它会打开frmImages
并将表格的html页面加载到wbImages
。
我在wbImages
中添加了一个鼠标按下事件监听器,就像我在wbContent
中一样。当用户单击wbImages内的表中的链接时,可以打开其父表单frmContent
中的链接。
我已尝试wbImages.Stop()
阻止wbImages
导航,但这不起作用。
我尝试将焦点设置为frmContent,然后将URL加载到父WebBrowser,wbContent中,这不起作用。然后我唯一可以做的就是在将URL发送到父窗口之前添加MessageBox。
下面的代码有效,但是如果我删除了MessageBox,它会在wbImages中加载URL。
Public Sub wpMouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
Dim bookmarkElement = wbImages.Document.GetElementFromPoint(e.ClientMousePosition)
If bookmarkElement.GetAttribute("href").ToString() <> "" Then
testUrl = bookmarkElement.GetAttribute("href").ToString()
MessageBox.Show(testUrl)
frmContent.Focus()
frmContent.wbContent.Navigate(New Uri(testUrl))
End If
End If
End Sub
修改
如果我删除了frmContent.wbContent.Navigate(New Uri(testUrl)),wbImages仍会导航。我必须错误地实现了ReturnValue,或者我的事件处理程序错误,而.Stop()也不起作用。在我从这里的建议做出任何更改之前,这是整个事件处理程序代码。
Private Sub frmImages_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
AddHandler wbImages.Document.MouseDown, AddressOf wpMouseDownEvent
End Sub
Private Sub wpMouseDownEvent(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs)
Dim event_html As New HtmlElementEventHandler(AddressOf wpMouseDown)
event_html.Invoke(sender, e)
End Sub
Public Sub wpMouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
Dim bookmarkElement = wbImages.Document.GetElementFromPoint(e.ClientMousePosition)
If bookmarkElement.GetAttribute("href").ToString() <> "" Then
testUrl = bookmarkElement.GetAttribute("href").ToString()
'Need testUrl to be passed to the Navigation for wbContent
End If
End If
End Sub
答案 0 :(得分:2)
您需要将事件的ReturnValue
设置为False
以阻止默认操作,就像您从Javascript中的false
处理程序返回onclick
以防止默认操作。
事件处理程序可能在不同的线程上运行,或者事件序列在以这种方式使用时根本不起作用。我怀疑MessageBox使它工作,因为它运行一个事件循环,处理一些需要在另一个导航可能发生之前处理的消息。通过使用BeginInvoke
延迟导航,可以解决这两种情况中的任何一种情况。我不是VB.NET程序员,但我想是这样的事情:
frmContent.BeginInvoke(Function ()
frmContent.Activate()
frmContent.wbContent.Navigate(New Uri(testUrl))
End Function)