我的WPF应用程序正在创建多个WebBrowser控件。我知道如何在每个文档中操作HtmlDocument以及如何处理它们上的鼠标事件。 但是,从具有IHTMLEventObj2对象作为参数的鼠标事件中,如何检索托管WebBrowse? 我可以通过srcElement.document访问该文档但是如何“向上导航”到托管此文档的WebBrowser? 我想过使用'Tag'属性,但HTMLDocument没有。 作为最后的手段,我可能会使用基于HtmlDocument对象的哈希表,但这对于这么简单的事情来说有点复杂......
答案 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);
无效,因为每次执行该行时,都会创建一个新的处理程序,完全不等于使用+ =
创建的处理程序