[英]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.