私はWPFアプリケーションを持っています。私はそれの中にSilverlightアプリケーションを埋め込む必要があります。私が理解しているように、これを行う最も一般的な方法は、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オブジェクトを取得します。それは動的なものとして扱うことはできませんが、それは何ですか?どのメソッドを呼び出すか?
ありがとう、それは素晴らしいですが、私はホストとSLアプリの間ですべての時間を通信する必要があります。 – Shrike