TechEd 2009のMVPラウンジでお見せしたSilverlight 3のマルチタッチ対応のピアノのデモですが、その後の調査で作成したデモのバグのためにSilverlight3ランタイムがハングアップしたようになっていたことが判明しました。この件は、多くの方が陥りそうな気がするので自戒の意味も込めて、状況を以下に記載します。
if tp.Action == TouchAction.Down) { Path hitKey = null; // タッチされた場所の最上位のFrameworkElementを取得 FrameworkElement hitElement = tp.TouchDevice.DirectOver as FrameworkElement; // これが対処したコード while (hitElement != null) { if (hitElement is Path) { hitKey = hitElement as Path; Breake; } // Visual Tree を上へたどる hitElement = hitElement.Parent as FrameworkElement; } if (hitKey != null) タッチダウンの動作を記述 }
上記のwhile文が対処コードです。このサンプルでは、Pathオブジェクトにタッチした場合に動作を作り込んでいます。while文の中で「hitElement = hitElement.Parent as FrameworkElement」とすることでVisual Treeを最上位までたどりnullでwhile文を抜けます。このwhile文を入れたことで、タッチダウンがMouseLeftButtonDownイベントに変換されなくなりました。
この動作はSilverlight3のマルチタッチ対応において仕様ともとれるものです。タッチデバイスでのタッチダウンイベントは、マウスのボタンダウンイベントと同様に扱うこともできるからです。