Я разрабатываю свое приложение для 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
, которое мне нужно использовать.