2011-02-08 4 views
1

私はWPFアプリケーションを持っています。私はそれの中にSil​​verlightアプリケーションを埋め込む必要があります。私が理解しているように、これを行う最も一般的な方法は、System.Windows.Controls.WebBrowserコントロール(注:私のアプリはWinFormsではないwpfです)を使用することです。
BTW:Silverlightアプリをホストするもう1つの方法 - COMインターフェイス(http://www.codeproject.com/KB/atl/Host_Silverlight_In_ATL.aspxを参照)を使用する方法です。.NET Desktopアプリの中に埋め込まれたSilverlightアプリとそれらの間のコミュニケーション

だから私はどこかでWebBrowserコントロールを持っている私のWPFのアプリで:

<WebBrowser x:Name="webBrowser"> 

私は私のhtmlページをロードする(のが、簡単のために地元のHTLMページを想定してみましょう):

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     webBrowser.LoadCompleted += WebBrowser_LoadCompleted; 
     webBrowser.Navigate(new Uri(Path.GetFullPath("HostPage.htm"))); 
    } 

    private void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     MessageBox.Show("Silverlight app has loaded"); 
    } 

[OK]をクリックします。それは簡単です。
これで、SL-appのホストと、ホストのSL-appと通信したいと思います。

私は、HTML(JS)とSilverlight(http://msdn.microsoft.com/en-us/library/cc645076%28VS.95%29.aspx)の間、およびWebブラウザー内の.NETとJSの間の相互運用性に関する技術を理解しています。
私はWebBrowser.ObjectForScriptingを(ComVisibleAttributeでマークされた)オブジェクトで設定することができ、オブジェクトはJSでアクセスします。
私も私の埋め込まれたSilverlightのアプリからこのオブジェクトへの参照を取得できます。

(ScriptObject) HtmlPage.Window.GetProperty("external"); 

私もJSへのSilverlightアプリ内のいくつかのオブジェクトを表示することができます(そしておそらくコードをホストする)HtmlPage.RegisterScriptableObject経由( "名"、anObject);

しかし、問題は、すべてのケースで、型なしのScriptObjectインスタンスを扱わなければならないということです。 しかし、ホストとSLアプリの間の「完全に管理されたコード」通信を設定したいと思います。複雑な構造/クラス/デリゲートを渡すこと、イベントを発生させることなどを意味します。つまり、「型指定されていないJS-stuff」はありません。

どうすればいいですか?

更新: 大丈夫、私がしたいことをする良い方法はないようです。 私はJSの相互運用性に対処しなければなりません。しかし、ここに私は問題があります。 ホストから、私はObjectForScriptingをセットアップし、SL-appはそれを使用できます。

((ScriptObject) HtmlPage.Window.GetProperty("external")).Invoke("methodName") 

ではなく、逆に:それはSL-アプリがWebBrowser.ObjectForScriptingに設定オブジェクトのメソッドから結果を取得することを意味します。

m_bridgeSl = new BridgeSl(); 
HtmlPage.RegisterScriptableObject("bridge", m_bridgeSl); 

次にHTMLでJS-機能を作成します:私は(タイプBridgeSlの)オブジェクトを登録私のSL-アプリで

pluginLoadedはSLプラグインのonLoadイベントのハンドラである
<script type="text/javascript"> 
var g_bridgeSl = null; 
function pluginLoaded(sender, args) { 
    g_bridgeSl = sender.getHost().Content.bridge; 
} 
</script> 

<object id="slCtrl" data="data:application/x-silverlight-2," type="application/x-silverlight-2" ...> 
    <param name="onLoad" value="pluginLoaded" /> 
</object> 

そして、このオブジェクトを返す関数を追加します。

function getBridge() { 
    return g_bridgeSl; 
} 

私は私が私のホストアプリ内BridgeSlのインスタンスを得ることができることを期待して、私は、すべてこのようなものをやった:

var bridgeSl = WebBrowser.InvokeScript("getBridge"); 

は実際に私が何かを得ます。これは "System .__ ComObject"のインスタンスです。しかし、私は、動的にキャストする場合:

dynamic dynBridgeSl = bridgeSl; 

が、私は「メソッドまたは操作が実装されていません」というメッセージをSystem.SystemExceptionオブジェクトを取得します。それは動的なものとして扱うことはできませんが、それは何ですか?どのメソッドを呼び出すか?

答えて

2

現時点では、管理のみの相互運用機能はありません。あなたが言及する2つのオプション(DOMブリッジ上のJavaScript interop、またはCOMホスティング)はすべて存在します。

私はあなたの研究をお勧めします - 私は質問をクリックしたときに私が言うつもりのすべてを知っていました!

0

SLアプリケーションとホストの間でどのように複雑な構造を渡すかについては完全にはわかりませんが、イベントを発生させるための1つのオプションはURL経由で情報を渡すことです。 WebBroswer.Navigatedイベントにイベントハンドラをアタッチし、そのハンドラにURLの情報に基づいてホストのイベントを呼び出させます。

たとえば、WPF WebBrowserコントロール内でホストされているSilverlightアプリケーションがあります。ユーザーがSilverlightアプリケーション内の「閉じる」ボタンをクリックした時期を知りたかった。 WebBrowser.Navigatedにイベントハンドラを添付し、URLを解析しました。私たちは具体的にそのURLの中で "closed = true"を探しました。見つかった場合は、アプリケーション全体を閉じます(WPFホストが含まれています)。

Silverlight App inside WPF WebBrowser ?

+0

ありがとう、それは素晴らしいですが、私はホストとSLアプリの間ですべての時間を通信する必要があります。 – Shrike

関連する問題