C#+WPFチューニング戦記

C#とWPFで高速なコードと最適なシステムを書くためにやってきたいろいろな事を書いてみます。.NET Frameworkのソースコードを読み解きましょう。なお、ここに書かれているのは個人の見解であって何らかの団体や企業の見解を代表するものではありません。

Z順序の問題とCanvasの関係について

見たまま記述からはてな書式に切り替えてみました。
考えてみたらこっちのほうがWikiっぽくて使いやすいし軽快ですね。
なんか書くのに時間がかかると思っていたら、それは編集用のパネルが遅いからだった、というわけです。
テキストボックスが遅いとか、やっぱりいけませんね。

Wikiといえばその昔、某所のブログシステムを書いていた時に簡易Wikiのようなものを実装したことがありました。
いまやいろいろなWeb編集サービスに組み込まれているので珍しくも何ともありませんが、Wiki程度に簡単なテキストマークアップ言語というのは実に好みです。

手早くかける程度に慣れるにはもうちょっとだけ時間がかかりますが、表を書くくらいならすぐにでも書けますし、ありがたいことです。

本題であるところのZ順序の問題がなぜCanvasにとって深刻なのか、書いてみます。
パネルの種類によって、Z順序の問題は無視してよいほどどうでもいいのです。

パネルの種類 子コントロールのZ順序の速度の問題
StackPanel 重ならないから問題ない
WrapPanel 重ならないから問題ない
TabPanel 1枚しか表示しないから問題ない
Grid 重ねない使い方が一般的なのでめったに問題にならないケースが多い
Canvas 重なるし、コントロールが増えることが多いので問題になる
DockPanel 重ならないから問題ない

他にもいろいろパネルはありますが、Canvas以外でZ順序の速度が問題になることは滅多にありません。
だから、CanvasのZ順序だけ再実装してくれないかなぁとつぶやくわけです。

しかし、あまり表面化していないだけで、上記のすべてのパネルはPanelを継承していますので、コントロール数が増えると過激に重くなります。
仮想化も万能ではありません。特にZ順序が問題になってしまったケースにおいてはこれは難儀です。
簡単に言えば、VisualTreeを変更するコスト、もしくはDataContextを付け替えて再バインディングが生じるコストなどが付随します。なかなか万能の処方が無いのが難しいところです。