2014-06-16 21 views
5

Come rendere perdere la messa a fuoco e nascondere la tastiera sullo schermo quando l'utente tocca la chiave virtuale Enter?Come fare in modo che TextBox non si concentri?

private void TheName_KeyDown(object sender, KeyRoutedEventArgs e) { 
     var tb = sender as TextBox; 
     if (e.Key == Windows.System.VirtualKey.Enter) { 
      // ... tb.LooseTheFocus_PLEASE(); !??? 
     } 
    } 
+3

non si può effettivamente. Devi mettere a fuoco un altro controllo. – Matthijs

+0

Come si fa? Ho provato this.Focus (Windows.UI.Xaml.FocusState.Pointer) - ignorato. – Harry

+0

Prova [mia soluzione] [1] su Hidding touch-tastiera su Windows 8. [1]: http://stackoverflow.com/questions/20858141/keyboard-wont-dismiss-even-after- focus-change/29124111 # 29124111 –

risposta

13
/// <summary> 
    /// Makes virtual keyboard disappear 
    /// </summary> 
    /// <param name="sender"></param> 
    private void LoseFocus(object sender) { 
     var control = sender as Control; 
     var isTabStop = control.IsTabStop; 
     control.IsTabStop = false; 
     control.IsEnabled = false; 
     control.IsEnabled = true; 
     control.IsTabStop = isTabStop; 
    } 

    /// <summary> 
    /// Makes virtual keyboard disappear when user taps enter key 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void LooseFocusOnEnter(object sender, KeyRoutedEventArgs e) { 
     if (e.Key == Windows.System.VirtualKey.Enter) { 
      e.Handled = true; LoseFocus(sender); 
     } 
    } 

E 'brutto. Ma funziona. La parte fondamentale è la proprietà IsTabStop. Se non lo tocco, la tastiera scompare per una frazione di secondo e ricompare.

1

Non esiste alcun modo per rimuovere la messa a fuoco da un controllo a livello di codice.

Un'opzione sarebbe quella di impostare lo stato attivo su un altro controllo del modulo, ad esempio un'etichetta che spiega che tipo di testo deve essere inserito nel TextBox.

In questo modo la casella di testo perde lo stato attivo.

Come mostrato nella this documentazione su Control.Focus():

Non è possibile rimuovere attivo da un controllo chiamando questo metodo con FocusState.Unfocused come parametro. Questo valore non è consentito e causa un'eccezione. Per rimuovere la messa a fuoco da un controllo, impostare lo stato attivo su un controllo diverso.

Basta usare Control.Focus(FocusState.Programmatic) per impostare lo stato attivo. Qualsiasi controllo dovrebbe fare.

+0

Non funziona. Non succede niente quando provo a mettere a fuoco l'etichetta (o qualsiasi altro elemento). – Harry

+0

Mi spiace, fammi modificare la mia risposta. – Matthijs

+0

Odio dirlo, ma ho provato questo, e non funziona. Ho impostato FocusState.Programatic - e la linea è appena ignorata. Ho provato ogni possibile valore per l'argomento Focus() senza fortuna. Ho cercato di mettere a fuoco la pagina, la griglia, l'elemento TextBlock, semplicemente si rifiuta di lavorare. Inserisco il codice nel gestore KeyDown, forse non può essere invocato da lì? – Harry

4

Basta impostare lo stato attivo sulla pagina.

this.Focus(); 
+1

Questo non funziona nell'app WP 8.1. Focus richiede un argomento, ma indipendentemente da ciò che fornisco, la tastiera virtuale rimane finché non faccio clic su uno spazio vuoto all'esterno del TextBox. – Harry

+1

Bene, correggi i tuoi tag. – Pantelis

+3

http://stackoverflow.com/questions/20858141/keyboard-wont-dismiss-even-after-focus-change – Pantelis

0

Per unfocus in app UWP fare semplicemente:

private void Input_KeyDown(object sender, KeyRoutedEventArgs e) 
{ 
    if (e.Key == VirtualKey.Enter) 
    { 
     //Do what you want upon enter 
     this.Focus(FocusState.Programmatic); 
    } 
} 
Problemi correlati