私の WPF アプリケーションは、複数の WebBrowser コントロールを作成しています。それぞれの中で HtmlDocument を操作する方法と、それらのマウス イベントを処理する方法も知っています。ただし、IHTMLEventObj2 オブジェクトをパラメーターとして持つマウス イベント内から、ホストしている WebBrowse を取得するにはどうすればよいでしょうか? srcElement.document からドキュメントにアクセスできますが、このドキュメントをホストしている WebBrowser に「移動」するにはどうすればよいですか? 「Tag」プロパティを使用することを考えましたが、HTMLDocument にはありません。最後の手段として、HtmlDocument オブジェクトに基づくハッシュ テーブルを使用することもできますが、これはこのような単純なことに対して少し複雑です...
1 に答える
マウスイベントをどこで/どのように取得しますsrcElement.document
か? ジャバスクリプトのようです。
true の場合、Web コントロールは DOM ツリー内で公開されていないため、JavaScript から Web コントロールにアクセスできないと確信しています。それを使用してwindow.external
(または同様の方法で) メソッドを公開し、メソッドを Web ブラウザーで動作させることもできますが、それは少し複雑ですが、この方法で可能であると確信しています。
そうでない場合、および C# でいくつかの mouseevent ハンドラーがある場合は、イベントが呼び出される前にハンドラーを Web ブラウザーにリンクするだけです。それ以外の:
// 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
編集:あなたが尋ねたように、「より簡単な」アプローチは、ラムダとクロージャーを使用することです:
// 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
は引き続き使用可能であり、そのメソッドに渡すことができます。
ただし、(blah)=>blah
デリゲートをすばやく作成するためにラムダ (構文) を使用しているため、次の 2 つの非常に重要な点に注意する必要があります。
JustAMethodNotAHandler
は handlerではなく、単なるメソッドです。ラムダによって作成された無名関数が実際のハンドラーになります匿名関数は匿名であるため、後で登録を解除したい場合は苦労するでしょう。次のような試み:
wb.themouseevent -= (送信者、引数) => JustAMethodNotAHandler(wb、送信者、引数);
その行が実行されるたびに新しいハンドラが作成され、 += で作成されたものとはまったく等しくないため、機能しません