0

私の WPF アプリケーションは、複数の WebBrowser コントロールを作成しています。それぞれの中で HtmlDocument を操作する方法と、それらのマウス イベントを処理する方法も知っています。ただし、IHTMLEventObj2 オブジェクトをパラメーターとして持つマウス イベント内から、ホストしている WebBrowse を取得するにはどうすればよいでしょうか? srcElement.document からドキュメントにアクセスできますが、このドキュメントをホストしている WebBrowser に「移動」するにはどうすればよいですか? 「Tag」プロパティを使用することを考えましたが、HTMLDocument にはありません。最後の手段として、HtmlDocument オブジェクトに基づくハッシュ テーブルを使用することもできますが、これはこのような単純なことに対して少し複雑です...

4

1 に答える 1

0

マウスイベントをどこで/どのように取得します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、送信者、引数);

その行が実行されるたびに新しいハンドラが作成され、 += で作成されたものとはまったく等しくないため、機能しません

于 2015-08-09T12:16:17.570 に答える