«前の日記(2013年08月31日) 最新 次の日記(2013年09月11日)» 編集

日々をアレコレ


2013年09月04日

カスタムコントロール?

今、開発しているアプリ、データを可視化した上で、可視化した要素をクリックとかして編集とかできるようにする必要がある。しかも、要素が最大2000個とかあるようだし、ズームやスクロールの昨日も必要。ビットマップを描画して、という方法もあるのだけれど、それだと描画に時間が掛かりそうなので、クリックできる要素をコントロールとして持って、Canvas上に配置するという方法をとってコーディング中。Canvas上の配置は内部のデータと上位が持つデータとバインディングさせる仕組みをとって、なるべく1個ずつ処理するような記述はしないようにしてる。

でも、描画要素の生成だけは個別にやる必要がある。しかも、描画要素を生成しなければいけないタイミングが決まってないので、最悪の場合には2000個くらいの要素を一度に生成する可能性だってある。Debugビルドなら時間がかかるという記述もあるのだけど、Releaseビルドでも中身がLabelとButtonという単純なUserControlでも2000個を生成して、Canvasに配置するだけで1秒以上かかるという結果もでた。

かわりに何かいい方法ないかなーってことで、ContrtolTemplateを使う方法を現在模索中。あるコントロールに対してControlTemplateを適用して、同じように2000個生成すると時間が1/10くらいにはなった。何がボトルネックになっているのかはわからないけれど、生成することを早くするという点においてはこっちのよさげ。

で、具体的な方策として、まず適当なControlクラスを継承したクラスを定義し、それとは別にリソースディクショナリにコントロールテンプレートを定義する。リソースディクショナリで定義したコントロールテンプレートのターゲットを先に定義したControlクラスを継承クラスに設定し、そのクラスではコンストラクタ処理の中でリソースディクショナリを読み込んで自信のテンプレートをそれに設定する。これに依存プロパティとかと組み合わせたら結構柔軟にできるんじゃなかろうか?と思ってる。汎用性を持たせようとアレコレしてるせいか、試行錯誤してるところなので、まとまったら日記に書くぞ。

Tags: wpf

«前の日記(2013年08月31日) 最新 次の日記(2013年09月11日)» 編集