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さん。