【问题标题】:Web browser control: How to capture document events?Web 浏览器控件:如何捕获文档事件?
【发布时间】:2012-02-24 23:49:47
【问题描述】:

我正在使用 WPF 的 WebBrowser 控件来加载一个简单的网页。在此页面上,我有一个锚点或按钮。我想在我的应用程序代码后面(即在 C# 中)中捕获该按钮的单击事件。

有没有办法让 WebBrowser 控件捕获加载页面元素上的点击事件?

此外,是否可以在页面和 WebBrowser 之间传递事件触发数据?以上都应该是可能的吧?

  • 编辑:可能的解决方案:

我发现以下链接可能是一个解决方案。我还没有测试过,但值得一试。将根据我的测试结果更新此问题。

http://support.microsoft.com/kb/312777

【问题讨论】:

    标签: c# javascript wpf


    【解决方案1】:

    这是另一个例子。

    我试图通过在头部添加一个 DOM 元素 <script src="{path to remote file}" /> 来注入一个远程 javascript 文件并在准备好时执行一些代码,这与 jQuery.getScript(url, callback) 的想法基本相同..

    下面的代码可以正常工作。

    HtmlElementCollection head = browser.Document.GetElementsByTagName("head");
    if (head != null)
    {
        HtmlElement scriptEl = browser.Document.CreateElement("script");
        IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
        element.src = url;
        element.type = "text/javascript";
        head[0].AppendChild(scriptEl);
        // Listen for readyState changes
        ((mshtml.HTMLScriptEvents2_Event)element).onreadystatechange += delegate
        {
            if (element.readyState == "complete" || element.readyState == "loaded")
            {
                Callback.execute(callbackId);
            }
        };
    }
    

    【讨论】:

      【解决方案2】:

      找到好的答案 - 经过测试并且有效:

      • 从 COM 选项卡添加一个名为:Microsoft HTML 对象库的引用

      以下是示例代码:

      您将需要两个组件:WebBrowser (webBrowser1) 和一个 TextBox (textBox1)

      public partial class MainWindow : Window
      {
          public MainWindow()
          {
              InitializeComponent();
      
              webBrowser1.LoadCompleted += new LoadCompletedEventHandler(webBrowser1_LoadCompleted);
          }
      
          private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
          {
              mshtml.HTMLDocument doc;
              doc = (mshtml.HTMLDocument)webBrowser1.Document;
              mshtml.HTMLDocumentEvents2_Event iEvent;
              iEvent = (mshtml.HTMLDocumentEvents2_Event)doc;
              iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
          }
      
          private bool ClickEventHandler(mshtml.IHTMLEventObj e)
          {
              textBox1.Text = "Item Clicked";
              return true;
          }
      }
      

      【讨论】:

      • 由于没有给出其他答案,我将选择这个作为答案。虽然我找到了解决这个问题的更好方法。该方法在codegain.com/articles/wpf/ieprogramming/… 中进行了描述,它使用了一个名为 ObjectForScriptingHelper 的类。非常容易实现,而且效果很好。
      • 它对我来说似乎只有 20% 的时间有效,大多数时候它无法调用“ClickEventHandler”,即使 LoadCompleted 方法完全完成,我可以看到没有异常......有任何想法吗?我在这里发布了它:stackoverflow.com/questions/35058874/…
      • @Bassem 引用的 codegain 文章现在可以在这里找到:dotnetfunda.com/articles/show/840/…
      猜你喜欢
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2010-10-13
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      相关资源
      最近更新 更多