【问题标题】:Pass info back to parent into its WebBrowser Control将信息传递回父级到其 WebBrowser 控件
【发布时间】:2014-04-22 12:33:23
【问题描述】:

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

【问题讨论】:

    标签: .net vb.net visual-studio-2010 webbrowser-control


    【解决方案1】:

    您需要将事件的ReturnValue 设置为False 以阻止默认操作,就像您从Javascript 中的onclick 处理程序返回false 以阻止默认操作一样。


    可能是事件处理程序在不同的线程上运行,或者事件序列在以这种方式使用时根本不起作用。我怀疑 MessageBox 使它工作,因为它运行一个事件循环,该循环处理一些需要在发生另一个导航之前处理的消息。通过使用BeginInvoke 推迟导航,这些情况中的任何一种都可能得到解决。我不是 VB.NET 程序员,但我认为是这样的:

    frmContent.BeginInvoke(Function ()
                               frmContent.Activate()
                               frmContent.wbContent.Navigate(New Uri(testUrl))
                           End Function)
    

    【讨论】:

    • 好的,我成功地阻止了 wbImages 导航,但我无法让它专注于 frmContent 以将链接加载到 wbContent 中。
    • 你试过Activate吗?来自 MSDN:“Focus 是一种低级方法,主要用于自定义控件作者。相反,应用程序程序员应该对子控件使用 Select 方法或 ActiveControl 属性,或对表单使用 Activate 方法。”
    • 刚试过frmContent.Activate()和frmContent.Select()。既不会将焦点更改为 frmConent,wbContent 也不会导航到 url。 messageBox 将如何使这项工作发挥作用?如果我们知道为什么 MessageBox 可以做到这一点,也许我们可以在没有实际 messageBox 的情况下模仿它。
    • 我希望 MessageBox 能够工作,因为它有一个消息泵。查看更新后的答案。
    猜你喜欢
    • 2014-12-13
    • 2019-10-19
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多