Silverlight上にPDFを表示したい。
いろいろ調べると、
Silverlightの内部にHTMLを表示する方法について
って記事が目に入ってきた。
ふむふむ。
要約すると、SilverlightにはHTMLをレンダリングする機能は提供されていないとのこと。
Silverlight4ではOut-Of-BrowserでWebBrowserクラスを使えばなんとかなるようだ。
WPFでWebBrowserクラスつかったけど、なんかいまいち。
つうか使えない。
どのように使えないかは、また後で記事でも書こう。
で、上記のURLを参照すると、HTMLをゴニョゴニョすればなんとかなるよー!って事が書いてある。
よゆうじゃね、とおもいHtmlPage.Document.CreateElement( String )で作ったIFRAMEをHtmlPage.Document.Bodyにかちこんでやった。
....
HtmlElement IFRAME = HtmlPage.Document.CreateElement( "IFRAME" );
IFRAME.SetAttribute( "src", "test.pdf" );
HtmlPage.Document.Body.AppendChild( IFRAME );
....
これで余裕で表示できる。
ただ、忘れちゃいけないことがある。
HTMLに<param name="windowless" value="true" />を記述する事だ。
これを忘れると、表示されないから注意が必要。
IFRAMEにスタイルでゴニョゴニョして、画面の左上にだそうとしても、なぜかでない。
こいちじかん悩んで、
Silverlightの内部にHTMLを表示する方法について
を再読すると<param name="windowless" value="true" />を追加しろと書いてあるじゃないか。
これを忘れると、Silverlightの画面が常に最前面に表示されているようだ。
PDFのしっぽがSilverlightからはみ出る素敵な画面を見ることができる。
IFRAME で style="position:absolute;"ってやった上にsrcを設定すると、
なぜかスクロールバーがエライ事になるんですけど、仕様ですかMSさん。
位置をちゃんと指定するなら、IFRAME をさらにDIVかなにかで囲んであげれば幸せになれるようだ。
....
HtmlElement Div = HtmlPage.Document.CreateElement( "Div" );
// 周りを囲むDivのスタイルを設定する。
Div .SetStyleAttribute( "position" , "absolute" );
Div .SetStyleAttribute( "top" , /* 上からの距離 */ );
Div .SetStyleAttribute( "left" , /* 左からの距離 */ );
Div .SetStyleAttribute( "width" , /* 幅 */ );
Div .SetStyleAttribute( "height" , /* 高さ */ );
// DivをBodyの子要素に追加
HtmlPage.Document.Body.AppendChild( Div );
HtmlElement IFRAME = HtmlPage.Document.CreateElement( "IFRAME" );
// IFRAMEの設定
IFRAME .SetAttribute( "src" , "test.pdf" );
IFRAME .SetAttribute( "width" , "100%" );
IFRAME .SetAttribute( "height" , "100%" );
// Divの子要素として追加
Div .AppendChild( IFRAME );
....
IFREMAの代わりにEBMEDを使用してみたが、一度AppendChildした後からだとsrcの書き換えを行っても再描画されない。
それに、高さ・幅とも100%を指定すると描画領域がエライことになる。
そと側のDivを余裕で無視してくれるのだ。
さすがはMSさん。