かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

タッチ?マウス?スタイラス?

気になったのでTouchとMouseとStylusイベントの動きを軽く見てみました。軽くというのは時間がないので****Down系イベントだけ拾ってみました。Backgroundを指定したBorderを置いてCheckBoxを3つおく。

<Window x:Class="StylusCheckApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border BorderBrush="Black" BorderThickness="1" Margin="10" Grid.Row="3" StylusDown="Border_StylusDown" MouseDown="Border_MouseDown" TouchDown="Border_TouchDown" Background="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
        <CheckBox x:Name="checkBoxStylus" Content="Handle Stylus" Margin="10"/>
        <CheckBox x:Name="checkBoxMouse" Content="Handle Mouse" Grid.Row="1" Margin="10"/>
        <CheckBox x:Name="checkBoxTouch" Content="Handle Touch" Grid.Row="2" Margin="10"/>
    </Grid>
</Window>

んで、コードビハインドでデバッグログを吐くだけ。

using System.Diagnostics;
using System.Windows;
using System.Windows.Input;

namespace StylusCheckApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Border_StylusDown(object sender, StylusDownEventArgs e)
        {
            Debug.WriteLine("StylusDown");
            e.Handled = this.checkBoxStylus.IsChecked.Value;
        }

        private void Border_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Debug.WriteLine("MouseDown");
            e.Handled = this.checkBoxMouse.IsChecked.Value;
        }

        private void Border_TouchDown(object sender, TouchEventArgs e)
        {
            Debug.WriteLine("TouchDown");
            e.Handled = this.checkBoxTouch.IsChecked.Value;
        }
    }
}

実行してみる。

マウスクリック
MouseDown

タッチ
StylusDown
TouchDown
MouseDown

スタイラスでツン
StylusDown
MouseDown

ちょっとびっくりしたのがタッチしても最初のイベントはスタイラス。ほほう…。ではStylusでHandledをTrueにすると…。

マウスクリック
MouseDown

タッチ
StylusDown
MouseDown

スタイラスでツン
StylusDown
MouseDown

タッチイベントはスキップされたけどマウスイベントにはいっちゃうのか。んじゃ、タッチイベントだけHandledをTrueにすると…。

マウスクリック
MouseDown

タッチ
StylusDown
TouchDown
MouseDown

スタイラスでツン
StylusDown
MouseDown

ほう…。

まとめ

****Down系イベントだけを見るとMouseイベントの前にStylus→Touch→Mouseときたらタッチ操作で、Stylus→MouseときたらスタイラスでMouseだけだとマウスということになります。
Preview****系とか、その他もろもろのStylus*****系イベントとかを駆使すると、もっと何かかわるのかもしれないけど、続きは後日の自分か誰か…。