2012-08-27 15 views
15

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ć.

+0

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 ... –

+0

Świetne rozwiązanie, byłem beznadziejny w tym wydaniu :). Ta sama technika działa również dla ListView. –

+0

Czy możesz przenieść swoje rozwiązanie do odpowiedzi poniżej, abyśmy mogli uzyskać to z listy bez odpowiedzi? Dzięki. –

Odpowiedz

3

Należy ustawić ostrość na dowolny element sterujący, który nie akceptuje wprowadzania tekstu. Należy jednak pamiętać, że jeśli użytkownik ręcznie pokazał klawiaturę (w przeciwieństwie do tego, że automatycznie wyświetlił się, ponieważ pole tekstowe otrzymało ostrość), klawiatura pozostanie otwarta.

Sprawdź to naprawdę dobry wątek o klawiaturze ekranowej o więcej informacji:

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

+0

To nie działało, ponieważ wszystkie moje elementy sterujące znajdują się w widoku GridView lub ListView. Domyślnie ustawienie fokusu na kontrolce w GridView lub ListView nie powoduje odrzucenia klawiatury. Wydaje mi się, że wymyśliłem sposób, który zamieszczam tutaj wkrótce. – thisnick

+8

Zdefiniuj krótko? – Spiked3