WPF webbrowser控件vs winforms

时间:2012-01-15 16:09:04

标签: wpf winforms automation webbrowser-control

我正在创建一个wpf应用程序,我正在使用webbrowser控件。无论如何有时我需要寻找html元素,调用点击和其他基本功能。

在winforms webbrowser控件中,我可以通过执行以下操作来实现:

 webBrowser1.Document.GetElementById("someId").SetAttribute("value", "I change the value");

在wpf webbrowser控件中,我设法通过以下方式实现了同样的目的:

  dynamic d = webBrowser1.Document;  
  var el = d.GetElementById("someId").SetAttribute("value", "I change the value");

我还设法通过使用动态类型调用wpf webbrowser控件中的单击。有时我会得到exeptions。

如何在wpf webbrowser控件中查找 html元素,设置属性并调用点击次数,而无需使用我常常遇到异常的动态类型?我想用wpf webbrowser控件替换我的wpf应用程序中的winforms webbrowser控件。

2 个答案:

答案 0 :(得分:1)

使用以下命名空间,以此方式可以获取所有元素属性和事件处理程序属性:

    using mshtml;

    private mshtml.HTMLDocumentEvents2_Event documentEvents;
    private mshtml.IHTMLDocument2 documentText;

在构造函数或xaml中设置LoadComplete事件:

    webBrowser.LoadCompleted += webBrowser_LoadCompleted;

然后在该方法中创建新的webbrowser文档对象并查看可用属性并创建新事件,如下所示:

    private void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
    {
        documentText = (IHTMLDocument2)webBrowserChat.Document; //this will access the document properties as needed
        documentEvents = (HTMLDocumentEvents2_Event)webBrowserChat.Document; // this will access the events properties as needed
        documentEvents.onkeydown += webBrowserChat_MouseDown;
        documentEvents.oncontextmenu += webBrowserChat_ContextMenuOpening;
    }

    private void webBrowser_MouseDown(IHTMLEventObj pEvtObj)
    {
         pEvtObj.returnValue = false; // Stops key down
         pEvtObj.returnValue = true; // Return value as pressed to be true;
    }

    private bool webBrowserChat_ContextMenuOpening(IHTMLEventObj pEvtObj)
    {
        return false; // ContextMenu wont open
        // return true;  ContextMenu will open
        // Here you can create your custom contextmenu or whatever you want
    }

答案 1 :(得分:-3)

我这样做的方式是......

使用HTTPRequest下载要呈现的页面的HTML文本。使用HTML文本中的HTML敏捷包注入java脚本。如果你想使用jQuery,那么你必须首先jQuerify你的页面,然后将事件与你的dom元素绑定。您也可以在脚本中以其他方式调用c#函数。 不要乱用动态类型,因此也不例外。

您还可以使用此link上的扩展方法来阻止WC中的脚本错误。

Thisthis可能会有所帮助。