tmytのらくがき

個人の日記レベルです

タップしてもInputPaneの閉じないボタン

  • 追記1:PCでしか動作しません (電話だとOnCreateAutomationPeerを呼んでくれない)
  • 追記2:電話でも動作するもっと簡単な方法がありました
<!-- こうするとSIPが閉じない -->
<Button IsTabStop="false" />

  • 以下古い話

Aristeaの電話版とかでInputPaneが開いてる状態でボタンを押そうとすると InputPaneが閉じて操作しづらいとかそういうのがあります。

実際Aristeaでも使いづらくてどうにかしたいと思ってたところ、方法を見つけたので書いておきます。 このコードをプロジェクトに追加して、Button使ってるところで代わりにMenuStyleButtonを使うと、 ボタンを押してもInputPaneが閉じなくなります。

public class MenuStyleButton : Button
{
    public class CustomButtonAutomationPeer : ButtonAutomationPeer
    {
        public CustomButtonAutomationPeer(Button owner) : base(owner)
        {
        }

        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.Menu;
        }
    }

    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new CustomButtonAutomationPeer(this);
    }
}

やってることは、Controlに対してAutomationPeerを要求された場合に、カスタムのAutomationPeerを返答し、 さらにカスタムのAutomationPeerの中でAutomationControlType.Menuを返答すると、なんとInputPaneが閉じなくなります。

というのは、MSDNのこのへんにしれっと書いていました。

テキスト入力のコンテキストでフォーカスがテキスト入力フィールドから移動したときにキーボードの表示を持続させるには、カスタム コントロールに適切な UI オートメーションの AutomationControlType を使います。たとえば、テキスト入力シナリオの半ばでメニューを開くときに、キーボードを表示したままにするには、このメニューに Menu の AutomationControlType が必要です。

タッチ キーボードの表示への応答 - Windows app development

Aristeaはたぶん今日夜ぐらいに対応してリリース予定です。https://msdn.microsoft.com/ja-jp/library/windows/apps/mt185611.aspx