2011-07-12 3 views
4

現在、Silverlightクライアントで実際に生成されていないSilverlight XAMLコンテンツを画像に変換する必要があるレポート機能を実装しようとしています。ブラウザでUIをレンダリングせずにサーバー側のSilverlight 4 XAMLから画像を生成する

私が解決しようとしている問題は、Silverlightクライアントに最初に表示されていないSilverlight XAMLをイメージとしてレンダリングする方法です。私は前にこれをやっただけの時間は画像として現在表示されているUIをレンダリングするためにWriteableBitmap APIを使用して、その後、必要に応じてPNG/JPEGに変換していました。私は、XAMLサーバ側のレンダリングのオプションを持っているように、私は、XAMLをレンダリングするためにWPFの機能を使用するように期待していた - しかし、それはだとしてSilverlightのXAMLは、この動作しますか?

これを行うには良い方法はありませんが、私が見る限りでは、PDFビューアのSilverlightクライアントコントロールの背景に隠されたUIを試してレンダリングし、書き込み可能なビットマップをプルして - しかし、明らかにこのアプローチではオーバーヘッドがあり、それは理想的ではありません。

これについてのご意見はありがたいことですが、それは私の過去数日間の頭を傷つけています!

答えて

0

はここでスニペットです。

これをSilverlightで強制しようとすると時間が浪費してしまったので、すべての提案に感謝します。

2

珍しい要求...あなたの目的に合ったものは、Chromium、特にそのための.Netラッパーです。あなたは、その後、それまで(シルバーを含む)HTMLページをレンダリングし、それをメモリにインスタンス化(その機能がラッパーに組み込まれている)イメージとしてそれをレンダリングすることができます。これはまだあなたがページを「ダウンロード」して「レンダリング」していることを意味しますが、このサーバー側を行うことは大丈夫です。

私がよく知っている2つのChromiumラッパーは、AwesomiumTroymiumです。 Awesomiumは専門的に開発し、Troymiumはまだベータ版であり、おそらくそれほど成熟していないですが、より広範なラッパーを持っている(現在は無料です)しながら、合理的に魅力的なインディーライセンスモデルを持っています。 Awesomiumには、Webページをダウンロードしてイメージにレンダリングするサンプルが含まれています。

WPFの機能を使用することはできませんが、Silverlightは別のランタイムを使用します。

+0

私はWPFを使用してXAMLをレンダリングすることはできませんが、これは私の次のコールポートです。乾杯、あなたは更新され続けるでしょう – StickyMcGinty

3

私はXAMLをレンダリングし、それからBMPを生成するために、WPFのランタイムを使用しようとするだろう。通常、Silverlightで動作するXAMLはWPFで動作しますが、その逆は必ずしも真ではありません。

WPFを使用すると、コントロールをプログラムでインスタンス化したり、緩いXAMLを読み込んだりすることができます。次に、レイアウトを更新し、ビジュアルをビットマップにキャプチャするように指示できます。

EDIT

サーバー上のXAMLを取得するには、私はあなたがあなたの溶液中での新しいWPFのクラスライブラリプロジェクトを作成することをお勧めします。そして、むしろそれらをコピーするよりも、そのプロジェクトにアイテム「既存の追加」と「リンク」ファイルとして所望のXAMLファイルを追加するために選択します。あなたはSilverlightとWPFのプロジェクト間で1つのファイルを共有することができますこの方法を。

DLLをコンパイルし、画像出力を返すサービスまたはページ内のサーバー上でそのDLLを使用します。そのページで、ユーザーコントロールのインスタンスを作成し、datacontextを設定して、イメージを出力します。ビジュアルからイメージをキャプチャするには、RenderTargetBitmapを使用できます。ずっとしようと私は、サーバー側ででGDIを使用してUIをレンダリングして行くことにしました失敗した後

var arrangeSize = new Size(300, 300); 
var arrangeRect = new Rect(new Point(0, 0), arrangeSize); 

var control = new MyControl(); 
control.DataContext = new MyViewModel(); 
control.Measure(arrangeSize); 
control.Arrange(arrangeRect); 
control.InvalidateVisual(); 
control.UpdateLayout(); 

RenderTargetBitmap renderTarget = 
    new RenderTargetBitmap(
     arrangeSize.X, 
     arrangeSize.Y, 
     96, 
     96, 
     System.Windows.Media.PixelFormats.Default 
    ); 

renderTarget.Render(control); 

var encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(renderTarget)); 

using (var pageOutStream = new FileStream(targetSavePath + ".png", FileMode.Create, FileAccess.Write)) 
{ 
    encoder.Save(pageOutStream); 
    pageOutStream.Close(); 
} 
+0

ありがとう、私はこれを見て、私が得るところを見てみましょう。私はUIレイアウトとオブジェクトの属性をとにかく持っているので、WPFでXAMLを作成するのに十分シンプルでなければなりません...私はSLとWPFの間の非互換性を心配していますXAML – StickyMcGinty

+0

OKを見て時間を見つけました - どのようにSilverlight XAMLをサーバーに送り返すことができるかについての考え方はありますか? SLではXamlWriterが利用できません。また、XAMLが生成される前にLayoutRootでCLRオブジェクトコントロールをレンダリングする必要があるようです。 – StickyMcGinty

+0

サンプルを追加し、あなたの質問に答えてください。私はあなたの銀色ソリューション内でxamlを動的に生成していないと仮定します。その仮定が正しければ、上記が働く可能性があります。適切なデータをサーバーに送り返すだけで、コントロールのインスタンス化、データのコントロールへのバインド、およびイメージのレンダリングができるようになります。 – NathanAW