Windows 8 - Как убрать сенсорную клавиатуру?
Я разрабатываю свое приложение для Windows 8 на С#, и очень неприятно то, что сенсорная клавиатура иногда остается на экране, несмотря на то, что все текстовые поля потеряли фокус.
Я прочитал статью белую бумагу с отладкой клавиатуры, которая объясняет, что при переключении с управления на управление клавиатура может оставаться включенной, даже если управление может не принимать ввод с клавиатуры. Это было бы моим делом, потому что все мое содержимое размещено либо в GridView, либо в ListView. Когда пользователь нажимает на любой элемент на экране, кран будет приземляться на эти элементы управления. Это очень раздражает, потому что клавиатура занимает половину экрана, и нет возможности закрыть клавиатуру.
Я попытался отключить текстовое поле, и оно не повлияло. Единственный способ удалить клавиатуру - установить фокус на кнопку, которая чрезвычайно взламывается.
Я думал, что мне нужно что-то сделать с помощью "AutomationPeer", но я не совсем понимаю, что именно делать. Есть ли способ отменить это поведение?
Edit:
Я понял это. Цель состоит в том, чтобы изменить тип управления элементом 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
, которое мне нужно использовать.
Ответы
Ответ 1
Что вам нужно сделать, это настроить фокус на любой элемент управления, который не принимает текстовую запись. Однако имейте в виду, что если пользователь вручную показал клавиатуру (в отличие от нее, автоматически показывающей, поскольку TextBox получил фокус), клавиатура останется открытой.
Посмотрите этот действительно хороший поток о экранной клавиатуре для получения дополнительной информации:
http://social.msdn.microsoft.com/Forums/pl/winappswithcsharp/thread/3c227262-1d2c-4382-9c50-5b71d2b5d823