UIElementをラスターデータで出力するのにはWriteableBitmapが使えますが、ベクターデータで出力するのにXAMLを使ってみました。サンプルではVisual TreeをTreeViewで表示しているため、コントロールの内部構造と比較できます。 ⇒ 動作確認とソース
Silverlightのコントロールの外観はShapeとTextBlockを組み合わせて表現されています。Visual Treeをたどってそれらを集めれば、見た目は同じXAMLが得られそうです。実験してみたところ、ほぼ同じ見た目のXAMLが出力できました。元のSilverlightと出力したXAMLとの違いは以下の通りです。
- 見た目だけを再現するため、Panel(Grid/Canvas/Stack)の階層構造は無視してフラットにCanvasに並べています。
- XAMLを開くとWPFでレンダリングされるためフォントが異なります。
- スクロールバーのボタン(RepeatButton)が消えています。
- System.Windows.Shapes.PathのDataに含まれるPathGrometryからFiguresが取得できないためです。取得しようとするとFiguresがクリアされてSilverlight上からも消えてしまうため、XAML出力の際にFiguresを無視しています。自前のコードで設定したFiguresではこのような問題はありません。
- TextBoxの中身が表示されません。
- TextBoxの内部はMS.Internal.TextBoxViewで行き止まりになっていて、そこから先はたどれないためです。
実際に使うときはSilverlightのコントロールではなく自前で描画したオブジェクトが対象となるはずなので、あまり問題にはならないでしょう。それよりもXAMLが編集できるドローツールがExpression Blendくらいしかない方が問題です。現時点ではXAMLで出力してもあまり使い道がなさそうです。