かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

気になったので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*****系イベントとかを駆使すると、もっと何かかわるのかもしれないけど、続きは後日の自分か誰か…。