繁体   English   中英

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

[英]How to retrieve the WebBrowser control from the HTMLDocument it contains, in WPF?

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

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

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

如果不正确,并且在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

编辑:按照您的要求,“更简单”的方法是使用lambda和闭包:

// 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);

由于每次执行该行都会创建一个新的处理程序,该处理程序完全不等于使用+ =创建的那个处理程序,因此它将不起作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM