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
。