XAMLについて

前々エントリの


Chart -Width 300 -Height 250 -Theme Theme3 -Watermark $false -Animation $true -Series (
DataSeries -DataPoints $(
1..(Get-Random -min 3 -max 6) | ForEach-Object { DataPoint -YValue (Get-Random 100) }
)
) | Boots
XAMLで(面倒と言うか書き方が分からなかったのでランダムになってるところを固定にして)書き直すと

<vc:Chart xmlns:vc="clr-namespace:Visifire.Charts;assembly=WPFVisifire.Charts"
          Width="300" Height="250" Theme="Theme3" Watermark="False" AnimationEnabled="True">
  <vc:Chart.Series>
    <vc:DataSeries>
      <vc:DataSeries.DataPoints>
        <vc:DataPoint YValue="10" />
        <vc:DataPoint YValue="20" />
      </vc:DataSeries.DataPoints>
    </vc:DataSeries>
  </vc:Chart.Series>
</vc:Chart>

こういう感じで、C#で書くとこうなる。

Chart chrt = new Chart() {
   Width = 300, Height = 250, Theme = "Theme3", Watermark = false,
   AnimationEnabled = true,
};
DataSeries ds = new DataSeries();
ds.DataPoints.Add(new DataPoint() { YValue = 10 });
ds.DataPoints.Add(new DataPoint() { YValue = 20 });
chrt.Series.Add(ds);

本当は、C#でもオブジェクトのnewのみで再現したかったんだけど、ObservableCollectionのメンバーは、newして代入すると上手く動かないようなので、addで追加するようにした。このへん、PowerBootsではどうしてるのかなー、と思って、(Get-Item Function:\Chart).Definitionとかで、自動生成されるインスタンス作成関数の定義を覗いて見ると、パラメータで渡されたオブジェクトがIListだったらaddを試みるようにされてるっぽかった。で、まぁ、こうして並べてみると、これだけみるとPowerBootsは結構良い、綺麗じゃないかなーと思った。
普段仕事ではASP.NETばかり触ってるので、XAMLもその延長線上的なイメージで捉えてたんだけど、やっぱり全然違うものだなー。aspxファイルはどこまで行っても、htmlに埋め込まれた要素をプログラムから扱える、という感じで捉えるのが妥当なところだろうと思うけど、XAMLはUIを表現しやすい形でインスタンス生成を指示できるというか。
エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)』P11。

ごく簡単に言うと、XAMLCLRオブジェクトのためのXMLベースのインスタンススクリプトです。XMLのタグとCLRの型、およびXMLの属性とCLRのプロパティおよびイベントは、それぞれ対応しています。

PowerShellCLRオブジェクトを作るのにNew-Objectをつかうしかなくて、美しくないというか、あれやで、というところがあったので、PowerBootsのオブジェクト生成関数を作ってくれる、PowerBootsの機能はWPF使う以外にも便利な場面が一杯ありそう。