【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

UIElementをXAMLで出力

n7shi2009-07-29


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で出力してもあまり使い道がなさそうです。