2012-08-27 14 views
15

Sto sviluppando la mia app per Windows 8 in C# e una cosa molto fastidiosa è che la tastiera tattile a volte rimane sullo schermo anche se tutte le caselle di testo hanno perso la concentrazione.Windows 8 - Come smettere di toccare la tastiera?

Ho letto l'articolo keyboard dismissal logic white paper, che spiega che quando si passa da controllo a controllo, la tastiera può rimanere accesa anche se un controllo potrebbe non accettare l'input da tastiera. Questo sarebbe il mio caso perché tutti i miei contenuti sono ospitati in un GridView o in un ListView. Quando l'utente fa clic su qualsiasi elemento sullo schermo, il tocco si fermerà su questi controlli. Questo è molto fastidioso perché la tastiera occupa metà schermo e non c'è modo di chiudere la tastiera.

Ho provato a impostare la casella di testo per disabilitare e non ha avuto alcun effetto. L'unico modo per rimuovere la tastiera è di mettere a fuoco un pulsante, che è estremamente hacky.

Pensavo di aver bisogno di fare qualcosa con "AutomationPeer", ma non sono chiaro cosa esattamente fare. C'è un modo per ignorare questo comportamento?

Modifica: L'ho capito. L'obiettivo è di passare al tipo di controllo delle voci GridView e GridView non elencate nello whitepaper. Ecco il codice della griglia che ho fatto che mi ha permesso di nascondere la tastiera:

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(); 
    } 
} 

E 'un peccato che ho bisogno di scrivere questo molto codice per fare una cosa semplice. Questo non è assolutamente ottimale dal momento che avrei bisogno di fare questo per ciascuno dei ItemsControl che ho bisogno di usare.

+0

Se tutti i contenuti sono in una GridView o ListView, tutto quello che dovete fare è impostare la proprietà IsHitTestVisible su false e le caselle di testo non saranno in grado di accettare lo stato attivo, quindi la tastiera non verrà visualizzata. Sfortunatamente, perderai anche lo scrolling. Solo una FYI ... –

+0

Ottima soluzione, ero senza speranza con questo problema :). E la stessa tecnica funziona anche per ListView. –

+0

Puoi per favore spostare la tua soluzione a una risposta qui sotto in modo che possiamo ottenere questo dalla lista senza risposta? Grazie. –

risposta

3

Quello che devi fare è impostare lo stato attivo su qualsiasi controllo che non accetta l'immissione di testo. Tuttavia, tieni presente che se l'utente ha mostrato manualmente la tastiera (a differenza della visualizzazione automatica perché un TextBox ha ricevuto lo stato attivo), la tastiera rimarrà aperta.

Partenza davvero buona discussione sulla tastiera su schermo per ulteriori informazioni:

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

+0

Questo non ha funzionato come tutti i miei controlli sono in un GridView o un ListView. Per impostazione predefinita, l'attivazione di un controllo in GridView o ListView non elimina la tastiera. Penso di aver capito un modo, che sto pubblicando qui a breve. – thisnick

+8

Definisci a breve? – Spiked3

Problemi correlati