«前の日記(2013年10月13日) 最新 次の日記(2013年11月18日)» 編集

日々をアレコレ


2013年10月26日

コントロールの親子関係には気をつけろ

知ってる人にとっちゃ当たり前の話かもしれないのだけど、多すぎる親子関係はUIのレスポンスに大きく影響するっていうことを最近実感した。

今やってるプロジェクトというのが、Windows Embedded Standard7上で動くもので、インターフェースは基本的にタッチパネルというもの。で、各機能のためのユーザーコントロールを作って、自作したなんちゃってウィンドウマネージャを使って同一ウィンドウ内で表示管理する形にしていた。それが、開発用のPCどころか、実機でのマウス操作とタッチパネル操作でレスポンスがかなり違うものになってしまっていた。どれくらい違うかって言うと、タッチパネルでチェックボックスを操作すると指を話して、1~2秒くらい後にチェックマークが入るくらい。いろいろと調べてみると、コントロールの親子関係があるとデフォルトのままだと、親から子の順番でPreviewXXXなメッセージ処理が実行され、最後の子が実行された後は逆にXXXなメッセージ処理が実行されることと、それはウィンドウ内で閉じていることがわかった。試しに、実際に操作するユーザーコントロールをウィンドウに貼り付けただけだと、さくさく動くという結果に。

そこで、表示用のユーザーコントロールの構造をそのままコピーしたウィンドウクラスを作って、その表示をアプリケーションから管理するような形に変えてみた。結果としては相変わらずもっさりとした動作で、改善されたようにはあまり見えなかった。で、改めて作ったクラスの構造を確認したら、枠や角丸などの表示効果を実現するために大枠にBorderがあり、その中にGridを起き、ウィンドウ操作用の行と実際に表示したいユーザーコントロールを置くための行にわかれていて、ユーザーコントロールを置くための行にはさらにドロップシャドウを得るためにBorderが置かれていて、ユーザーコントロールはその子どもとして設定するような構造になっていた。わかりやすく書くと次のような感じ?

Window
  +-Border
      +-Grid
          +-Border(機能実現用)
              +-ユーザーコントロール(機能)

なので、実際に操作するユーザーコントロールからウィンドウまでの間に3つのコントロールがある。そこで、次のような構造に変えてみた。

Window
  +-Grid
      +-Rectangle (表示効果用)
      +-Grid(ウィンドウ操作用)
      +-ユーザーコントロール(機能)

表示効果はRectangeで実現するようにして、ユーザーコントロールと同一のGridに配置。ユーザーコントロールもBorderの子どもとしてではなく、Gridの子どもとして設定して、グリッド内の位置を設定する形に。つまりは、先に試したとりあえずウィンドウに直接おくのと近い構造にしたらやっぱりレスポンスが早くなった。よくよく調べてみたら、ウィンドウマネージャーの中にBorderがたくさんいて、そりゃ親子関係が多すぎるわ!っていうようなことになってた。あとで考えてみたら、その辺をもう少し整理するだけでレスポンス向上できたんでないかっていう話も。

Tags: wpf

«前の日記(2013年10月13日) 最新 次の日記(2013年11月18日)» 編集