15

C# で Windows 8 用のアプリを開発していますが、非常に厄介なことの 1 つは、すべてのテキスト ボックスがフォーカスを失ったにもかかわらず、タッチ キーボードが画面に表示されたままになることがあることです。

コントロールからコントロールに切り替えると、コントロールがキーボード入力を受け入れない場合でも、キーボードがオンのままになる可能性があることを説明している、キーボードの非表示ロジックに関するホワイト ペーパーの記事を読みました。これは、すべてのコンテンツが GridView または ListView でホストされているためです。ユーザーが画面上のアイテムをクリックすると、タップはこれらのコントロールに着陸します。キーボードが画面の半分を占有し、キーボードを閉じる方法がないため、これは非常に面倒です。

テキストボックスを無効に設定しようとしましたが、影響はありませんでした。キーボードを削除する唯一の方法は、ボタンにフォーカスを設定することですが、これは非常にハックです。

「AutomationPeer」で何かをする必要があると思いましたが、正確に何をすればよいかわかりません。この動作を無効にする方法はありますか?

編集: 私はこれを理解しました。目標は、ホワイトペーパーに記載されていない GridView および GridView アイテムのコントロール タイプに変更することです。これは、キーボードを閉じることができるグリッドのコードです。

public class KeyboardUnfocusableGridView : GridView
{
    private class KeyboardUnfocusableGridViewAutomationPeer : GridViewAutomationPeer
    {
        public KeyboardUnfocusableGridViewAutomationPeer(GridView owner)
            : base(owner)
        {
        }

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

    }

    private class KeyboardUnfocusableGridViewItemAutomationPeer : GridViewItemAutomationPeer
    {
        public KeyboardUnfocusableGridViewItemAutomationPeer(GridViewItem owner)
            : base(owner)
        { }

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

    }

    private class KeyboardUnfocusableGridViewItem : GridViewItem
    {
        protected override AutomationPeer OnCreateAutomationPeer()
        {
            var baseItem = base.OnCreateAutomationPeer();
            return new KeyboardUnfocusableGridViewItemAutomationPeer(this);
        }


    }

    protected override AutomationPeer OnCreateAutomationPeer()
    {
        var baseItem = base.OnCreateAutomationPeer();
        return new KeyboardUnfocusableGridViewAutomationPeer(this);
    }

    protected override Windows.UI.Xaml.DependencyObject GetContainerForItemOverride()
    {
        return new KeyboardUnfocusableGridViewItem();
    }
}

簡単なことをするのにこれほど多くのコードを書かなければならないのは残念です。使用する必要がある のそれぞれに対してこれを行う必要があるため、これは間違いなく最適ではありませんItemsControl

4

1 に答える 1

3

必要なことは、テキスト入力を受け付けないコントロールにフォーカスを設定することです。ただし、ユーザーがキーボードを手動で表示した場合 (TextBox がフォーカスを受け取ったために自動的に表示されるのではなく)、キーボードは開いたままになることに注意してください。

詳細については、オンスクリーン キーボードに関する次の非常に優れたスレッドを参照してください。

http://social.msdn.microsoft.com/Forums/pl/winappswithcsharp/thread/3c227262-1d2c-4382-9c50-5b71d2b5d823

于 2012-08-27T21:07:16.430 に答える