ページ

2010年1月5日火曜日

[WPF][Silverlight] Silverlight を WPF/XNA でホスト

CodePlex にこんなのがありました。
http://silverlightviewport.codeplex.com/
すごく簡潔な説明しか無いですし、ソースを見たわけでもないので詳細はわかんないんですが、WPF/XNA 上で Silverlight をホストするものみたいです。(Host ではなく Render になってますが)
また、「まだめっちゃ実験的なもんだよ!」 とのこと。

作者さんのブログの記事はこちら
Render Silverlight in WPF ? WPF SilverlightViewport
まず、「より明確に理解するために取り組んでみたホビープロジェクトだ」 といった文からはじまってます。
で、以降をざっと要約すると 「Silverlight は COM API でホストできるC++ のサンプルコードもある。けど、これは Win32 のウインドウに描画するのが前提。Silverlight はウインドウレスもサポートしてるはず。なので、Silverlight をウインドウレスにロードして画面の代わりに GDI ビットマップに描画させてみたらうまくいった。ただ、CPU 使用量が高かったのとアルファが透過できなかったけど。で、ちょっと汚くなったけど interop でごにょごにょしたらアルファも抜けるようになったし、パフォーマンスも良くなった。WriteableBitmap も使ってみたけど、結局 InteropBitmap にした。パフォーマンスも良くなったし。」 という感じです。

ソースをダウンロードして Visual Studio 2008 でソリューションを読み込んでやればビルドして実行できます。
(XNA を入れていない場合、XNATestApplication プロジェクトと Primitives3D プロジェクトが読み込めませんが、無視して読み込んでしまえばとりあえず TestApplication を動かしてみることはできました)
TestApplication を実行してみるとちゃんと動いてます。動いているのは http://silverlight.net/ にある SHOWCASE を表示しているやつです。
Window1.xaml の <slvp:SilverlightViewportElement ...> の Source を Source=”http://silverlight.net/content/samples/sl3/toolkitcontrolsamples/run/System.Windows.Controls.Samples.xap “ と書き換えてやって Silverlight 3 Toolkit を動かしてみましたが、それなりに動いてます。
なお、マウス入力はそれなりに生きてますが、キー入力は未対応みたいです。
(マウス入力は WPF 上のイベントを転送してやってるんじゃないかと思いますが、キー入力は IME とかいろいろ絡んできそうなので簡単ではないのかも)

作者さんもホビープロジェクトと言ってる通り、実用性についてはよくわかりません。
そもそも、「Silverlight をホストしなくても WebBrowser を使えばいいんじゃね?」 という気がしなくもないですw
けど、試みとしてはおもしろいですね。