Rozwijam swoją aplikację na Windows 8 w języku C#, a jedną z irytujących rzeczy jest to, że klawiatura dotykowa czasami pozostaje na ekranie, mimo że wszystkie pola tekstowe straciły ostrość.Windows 8 - Jak odrzucić klawiaturę dotykową?
Przeczytałem artykuł keyboard dismissal logic white paper, który wyjaśnia, że podczas przełączania z sterowania na sterowanie klawiatura może pozostać włączona, nawet jeśli sterowanie może nie akceptować wprowadzania z klawiatury. To byłby mój przypadek, ponieważ cała moja zawartość jest hostowana w GridView lub ListView. Gdy użytkownik kliknie dowolny element na ekranie, dotknięcie dotknie tych elementów sterujących. Jest to bardzo denerwujące, ponieważ klawiatura zajmuje połowę ekranu i nie ma możliwości zamknięcia klawiatury.
Próbowałem ustawić, aby pole tekstowe było wyłączone i nie miało wpływu. Jedynym sposobem na usunięcie klawiatury jest ustawienie ostrości na przycisku, który jest wyjątkowo hackowy.
Pomyślałem, że muszę coś zrobić z "AutomationPeer", ale nie jestem pewien, co dokładnie robić. Czy istnieje sposób na obejście tego zachowania?
Edytuj: Wymyśliłem to. Celem jest zmiana na typ kontrolny pozycji GridView i GridView niewymienionych w whitepaper. Oto kod z siatki, które zrobiłem, że pozwoliła mi schować klawiaturę:
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();
}
}
To niefortunne, że muszę napisać dużo kodu, aby zrobić prostą rzecz. To zdecydowanie nie jest optymalne, ponieważ musiałbym to zrobić dla każdego z ItemsControl
, którego potrzebuję użyć.
Jeśli wszystkie treści w GridView lub ListView, wszystko co musisz zrobić, to ustawić właściwość IsHitTestVisible na false, a twoje pola tekstowe nie będą w stanie zaakceptować fokusa, więc klawiatura się nie wyskoczy. Niestety stracisz także przewijanie. Tylko FYI ... –
Świetne rozwiązanie, byłem beznadziejny w tym wydaniu :). Ta sama technika działa również dla ListView. –
Czy możesz przenieść swoje rozwiązanie do odpowiedzi poniżej, abyśmy mogli uzyskać to z listy bez odpowiedzi? Dzięki. –