SilverLight WPF クロス表を作る。
別にクロス表を作ったというわけでもないけど、それっぽいことをやったので、メモ。
縦横に動的に伸びる表をどうやったら作れるか?ということ。
結論から言うと、ポイントは、データ構造をちゃんと作る、StackPanelを使うこと、Borderを使って、横幅の固定化、ItemsControlの入れ子化だ。
綺麗な縦横の線で区切られているのだからはじめは、Gridを使おうかと思ったけど、どうやって、動的に行と列を増やすことができるの?というところで詰まった。
そこで、StackPanelとBorderで横幅の固定化を行うという戦略と、ItemsControlの入れ子かを使って縦横を生成しようということを試みた。
ソース。
https://gist.github.com/kiichi54321/5290813
まずは、表示するためのデータ構造づくり。
ClusterTableクラスを大元として、ヘッダに当たる列とデータの中身に当たるところを定義する。
そして、ヘッダは、オブジェクトにしているけど、事実上はテキストが並んでいるだけ。拡張性も考えると、オブジェクトにしたほうがいいという判断。
LayerGroupクラスは、一列を表現する。Nameパラメータは、見出しに使う用である。
本来のクロス表では、ここまででいいのだが、こっちの要件として、さらに中身がテキストの列である必要があったので、Comunityクラスのリストをもたせている。
そのため、ソースでは、ItemsControlの三段入れ子になっている。
次にXAMLファイル。
縦横の大きさが未定のため、とりあえず、ScrollViewerで囲った。
ContentControlで、ClusterTableクラスをぶち込み先を明示化させる。
まずは、ヘッダのところをの処理。StackPanelの入れ子を作って、Borderで一番隅の空白のところを作る。
ItemsControlで、横を埋める。必ずBorderで枠の大きさを指定する。ItemsControl.ItemsPanelでStackPanelの指定もポイント。
次、行。はじめの行の名前のところは別でつくる。そして、入れ子のItemsControl データ構造としてちゃんと入れ子のリストにしておけば、こういう風に作れる。
さらに、その中でも、ItemsControlの入れ子はやれて、やっている。
なんか解説は飽きたのでこのくらいで。
とりあえず、ItemsControlの入れ子を使えば、結構色々できることがわかった。