WPFでタッチパネルアプリ
WPFでタッチパネルアプリを作成しています。
画面をタッチしても、Clickしても同じ動作をさせたいと思っていますが、TouchDownイベントで調子よくイベントが発生しているなと思っていたら、時々PreviewMouseLeftButtonDownまで合わせてイベントが発生して、二重に動作してしまうのが悩みでした。
タッチとクリック
なぜタッチとクリック操作2つ必要なのかというと、同じアプリケーションで、タッチパネルでも操作できるし、タッチパネル搭載でないパソコンでもマウスクリックでも操作したいからです。
Clickは”高レベル”なイベント
Clickイベントは、タッチしても、フォーカスがある時にスペースキーを押した時にでも発生します。Clickイベントと、TouchDownイベントに同じ処理を書くと、TouchDownイベントが発生した後にClickイベントも発生し、2重に処理が走ります。
また、私の環境(コードの書き方)によるものか分かりませんが、TouchDownイベントから、
ShowDialog()
すると、Touchイベントが終了する前に他の画面に遷移してしまうため、開いたウィンドウでの複数回はClickイベントが発生しないという問題にも直面しています。
二重に処理させないために e.StylusDevice == null
私が作成しているアプリは、「あ」から「ん」までボタンを並べ、ボタンが押されるたびにテキストボックスにその文字を追加していくものです。
PreviewMouseLeftButtonDownイベントにてマウスクリック動作を
TouchDownイベントにてタッチ動作を
それぞれ取得するようコード書いています。マウスを連打しても、TouchDownイベントが呼ばれる事はないのですが、タッチ動作を繰り返すと、不意にTouchDownイベントが呼ばれた後にPreviewMouseLeftButtonDownイベントが呼ばれてしまい、同じ文字が2重に重なっていくという問題にあたります。
そこで使用したのが
if (e.StylusDevice == null)
です。
e.StylusDevice == null の時はマウス操作
e.StylusDevice != null の時はタッチ操作
となります。
実際のコード
「あ」 ボタンを押したときに発生させるイベント
TouchDownイベント
private void B_a_TouchDown(object sender, TouchEventArgs e)
{
B_a.Style = (Style)this.FindResource("BS_Pussh");
T_Shimei.Text += "あ";
txt_KataKana += "ア";
}
PreviewMouseLeftButtonDownイベント
private void B_a_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.StylusDevice == null)
{
MessageBox.Show("MouseLeftButtonDown");
T_Shimei.Text += "あ";
txt_KataKana += "ア";
}
}
if (e.StylusDevice == null) とすることで、TouchDownイベントが発生している時にPreviewMouseLeftButtonDownイベントが発生してしまった時は、この処理をスルーする事ができます。
コメント