如何从WPF中包含的HTMLDocument中检索WebBrowser控件?

时间:2015-08-09 12:03:40

标签: wpf ihtmldocument2

我的WPF应用程序正在创建多个WebBrowser控件。我知道如何在每个文档中操作HtmlDocument以及如何处理它们上的鼠标事件。 但是,从具有IHTMLEventObj2对象作为参数的鼠标事件中,如何检索托管WebBrowse? 我可以通过srcElement.document访问该文档但是如何“向上导航”到托管此文档的WebBrowser? 我想过使用'Tag'属性,但HTMLDocument没有。 作为最后的手段,我可​​能会使用基于HtmlDocument对象的哈希表,但这对于这么简单的事情来说有点复杂......

1 个答案:

答案 0 :(得分:0)

你在哪里/如何获得鼠标事件和srcElement.document?好像是javascript。

如果为true,那么我很确定您无法从JavaScript访问Web控件,因为Web控件未在DOM树中公开。您可以尝试使用window.external(或类似的)并通过它公开方法,然后让方法在webbrowser上运行,但这有点令人费解,但我确信这样可行

如果不是真的,并且如果你在C#中有一些mouseevent处理程序,那么只需在调用事件之前将处理程序与webbrowser 链接。而不是:

// inside your Window/etc:

private int otherData;
private void MyHandler(...args) {
    if(otherData > 5)
        browser.Navigate("foobar.html");
}

WebBrowser wb = ...;
wb.themouseevent += myhandler; // equivalent to wb.themouseevent += this.myhandler;

使用闭包或自定义对象从之前“知道”浏览器的对象公开处理程序:

// inside or outside your Window/etc:
class MyHandlersWithSomeData
{
    public WebBrowser browser;
    public string someContextuaData;
    public int otherData;
    ....

    public void MyHandler(...args) {
        if(otherData > 5)
            browser.Navigate("foobar.html");
    }
}

// inside your Window/etc:
WebBrowser wb = ...;
var smartHandler = new MyHandlersWithSomeData{ browser = wb, otherData = 10 };
wb.themouseevent += smartHandler.MyHandler; // note that handler is not from "this" anymore

编辑:正如您所问,“更简单”的方法是使用lambdas和闭包:

// inside your Window/etc:

private int otherData;
private void JustAMethodNotAHandler(WebBrowser browser, object sender, EventArgs args) {
    if(otherData > 5)
        browser.Navigate("foobar.html");
}

WebBrowser wb = ...;
wb.themouseevent += (sender, args) => JustAMethodNotAHandler(wb, sender, args);

但是没有魔力。在引擎盖下,它几乎完全像上面的例子一样有一个额外的类,所谓的“闭包”。此类将存储对WebBrowser wb局部变量的引用,并且仅在此之后,当稍后调用JustAMethodNotAHandler时,wb仍然可用并且可以传递给该方法。

但是,由于我们现在使用lambdas((blah)=>blah语法)来快速创建委托,您必须注意两件非常重要的事情:

  • JustAMethodNotAHandler 不是处理程序,它只是一种方法。 lambda创建的匿名函数将是实际的处理程序
  • 因为匿名函数是匿名的,如果您以后想要取消注册,那么您将很难过。尝试过:

    wb.themouseevent - =(sender,args)=> JustAMethodNotAHandler(wb,sender,args);

无效,因为每次执行该行时,都会创建一个新的处理程序,完全不等于使用+ =

创建的处理程序