tmytのらくがき

個人の日記レベルです

UWPでタブレットモードかどうかを検出したい

Surfaceみたいな普段はタブレット、キーボード生やすとぱそこんみたいなめんどくさいデバイスで、タブレットの時とPCの時で微妙にUI変えたいとかあるかもしれません。たぶん。そういう時どうやって検出しますか。という話です。

まず、今タブレットモードなのかどうかは UIViewSettings.GetForCurrentView().UserInteractionMode ここをみると書いてます。MouseならPC、Touchならタブレットとかです。

で、これでぐぐるMSDNフォーラムでどうやってタブレットモードを検出したらいいのか。というスレッドがあって、上記のプロパティを読むといいよ!だけど値が変更された場合のイベントはないからな!!と書いてあってとてもつらい感じ。ですがこのイベントは以下のコードで代用できます。

public MainPage()
{
    this.InitializeComponent();

    CoreWindow.GetForCurrentThread().SizeChanged += MainPage_SizeChanged;
}

private void MainPage_SizeChanged(CoreWindow sender, WindowSizeChangedEventArgs args)
{
    var mode = UIViewSettings.GetForCurrentView().UserInteractionMode;
    // すきにする
}

タブレットモードになるとアプリがフルスクリーンになったり何らかウィンドウサイズに変更があることを利用しています。実際にUIに反映する場合は前回の値をキャッシュしておいて実際に変化していればなにかする。みたいにするべきですが今回はハンドリングまで。 ちなみに、PCでもタッチ使える場合で、タッチでウィンドウサイズを変更しても状態はMouseでした。