WPFには
ブラシというクラスがある。
.NET2.0にもあるが、比べ物にならないくらい強烈なやつだ。
.NET2.0ではせいぜい2色グラデーション塗りで満足するレベルだったが、WPFでは複雑なグラデーションもいけるし画像もブラシとして扱える。
PicturePanelが無くなるわけだ。
で、
ブラシは
リソース化できる。
リソースというのは、まぁHTMLで言えばjpgみたいなものか。
1個用意して、いろんなシーンで参照する。
ブラシをリソース化すればいろんなコントローラーで利用できるのだ。
そうすれば再利用もしやすいし、イメージの統一もたやすいわけよ。
今回、
背景を動的に更新する方法を調べた。
その背景というのはいろんなコントローラーで利用してまったく同時に更新される。
で、
更新パターンも非常に幾何学的。
ならば、
TileBrush(タイルパターンで塗りつぶしてくれるブラシ)の数字をちょこちょこっといじるのが高速かつシンプルだろう。(-_☆)キラーン
というわけでアプローチを考えた。
①タイリングの数字をバインディング
②コードで数字を更新
この2つが候補だ。
①なら
コードを書く必要はまったくない。
しかし無理だった(BLENDのバグじゃないか?)
そこで②を検証してみた。
更新方法はスライダーを利用。
スライダーの数値が変わった
というメッセージを受け取って、その数値でリソースブラシをいじれば良いはず。
しかし・・・。
いや、リソースの取得は成功したんだ。
この関数内で
FindResourcesを実行すれば簡単にできた。
このFindResourcesはどの階層にあるリソースでも拾ってくれるので便利なことこの上ない。
で、そのリソースをBrushにキャストして、タイリングのプロパティにスライダーの数値をぶち込めば、スライダーの動きに連動して全コントローラーの背景が動くはずなんだよ。
だが、ここで問題発生。
「読取専用」と言われて例外扱いされてしまうのだ。

ならば
一旦コピーして、数字書き換えてそれをぶち込んでやる!ヽ(`Д´)ノ
例外は出なかった。
だが更新されない。
なぜなんだぜ?(・ω・)
デバッグ情報ではちゃんと数字は更新されているようだが・・・。
こうなったら手も足も出ない。
助けを求めようにも、
こんな激レアなニーズ、ネットに文献があるはずもなく、社内のWPF使いはオレ一人。
あきらめて日報を書いた。そろそろ帰るか・・・。
否!
断じて否!!
.NET3.0の理念からしてできんはずがない!!
まだやる!!
というわけでインテリセンス出しまくって推理すること10数分。
SetValueというメソッドを発見。
そうか!
これだ!
これはDependencyPropertyに値をぶち込むヤツだ!
DependencyPropertyはなんだかよくわからんが、プロパティトリガーと深い関わりがある!!
これだあああああ!!!
素人プログラマーは論理より先に実行だぜ!(考えたってわからねー)
かくして
リソースブラシの動的更新は成功した。
そのコードは
リソースブラシをゲットして
数字を作って
SetValue
|
たったの3行だ。
これが.NET2.0なら
画像を保持するクラスを作ってそれを各コントローラーのサブクラスにし、タイミングを計って更新するのが合理的だろう(計算・描画と更新を分けて作るわけだ)。
更新情報受け取った | 画像をクリア
DrawLineでちまちま描く(For文でタイリング数分まわす) |
で、各コントローラーの描画ルーチンを呼んで
コントローラー描画部分(OnPaintオーバーライド) | 自分の画像を、画像クラス情報で埋める。 |
|
とまぁ
描画計算が複雑でコントローラーが5個もあれば軽く100行は行く。
そう、このブログのように。
色やフォントの保持、デリゲート設定などなど準備も大変だ。
それが.NET3.0なら
たったの3行!\(^o^)/
もう.NET2.0には戻れねーーー!!(2ヶ月しかやってないけど)
管理もデバッグもカスタマイズも劇的に向上するぜ!?
なんでみんな使わないの!?
まじで感動するって!!
ああ、この感動を同僚ギャルに熱く語りたい・・・!!
Posted at 2007/11/22 01:03:58 | |
トラックバック(0) |
プログラム | 日記