2013-02-12 7 views
13

Ho il metodo previewKeyDown nella mia finestra e mi piacerebbe sapere che il tasto premuto è solo A-Z lettera o 1-0 numero (senza alcunF1..12, invio, ctrl, alt etc - solo lettera o numero).Chiave WPF è la cifra o il numero

Ho provato Char.IsLetter, ma ho bisogno di dare il carattere, quindi e.key.ToString()[0] non funziona, perché è quasi sempre una lettera.

+0

Puoi inserire del codice per mostrare cosa intendi? – Igoy

+0

Una chiave è una chiave e non un carattere. – CodesInChaos

risposta

20

Qualcosa di simile lo farà:

if ((e.Key >= Key.A && e.Key <= Key.Z) || (e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)) 

Naturalmente si dovrà anche verificare che nessun tasti modificatori come CTRL vengono pressati in base alle proprie esigenze.

+0

Funziona bene, grazie. Ora un altro problema - focus su datagrid - nel codice ho usato qualcosa del tipo: if (e.key == Key.Down || Key.Up) dataGrid.selectedIndex = 0; DataGrid.Focus(), ma ora il tasto su/giù non ha modificato l'indice in datagrid. – user13657

+1

@AdamTruszkowski: Forse è pensato per essere 'e.Key == Key.Down || e.Key == Key.Up'? In ogni caso, per favore fai domande separate invece di metterle nei commenti. – Jon

+0

Sì, è e.Key == Key.Down || e.Key == Key.Down, ma ora voglio spostarmi su/giù in datagrid quando viene premuto su/giù – user13657

0

Puoi inserire del codice per mostrare cosa intendi? Non dovrebbe questo lavoro per voi

 if(e.key.ToString().Length==1) 

    `Char.IsLetter(e.key.ToString()[0])` 
    else 

// 
+0

e.key.tostring() [0] - così quando spingo il tasto sinistro del mouse - char è L che è una lettera, è per questo che non funziona :) – user13657

11

e.Key si sta dando un membro del enumSystem.Windows.Input.Key

Si dovrebbe essere in grado di eseguire le seguenti operazioni per determinare se si tratta di una lettera o un numero:

var isNumber = e.Key >= Key.D0 && e.Key <= Key.D9; 
var isLetter = e.Key >= Key.A && e.Key <= Key.Z; 
0

Aggiungere un riferimento a Microsoft.VisualBasic e utilizzare la funzione VB IsNumeric, combinata con char.IsLetter().

4

Nel vostro caso specifico la risposta fornita da Jon e Jeffery è probabilmente la cosa migliore, se è necessario testare la stringa per qualche altra logica lettera/numero quindi è possibile utilizzare la classe KeyConverter per convertire un System.Windows.Input.Key in una stringa

var strKey = new KeyConverter().ConvertToString(e.Key); 

È ancora necessario verificare se i tasti modificatori vengono tenuti premuti (Maiusc, Ctrl e Alt), e va notato che funziona solo per lettere e numeri. I caratteri speciali (come virgole, virgolette, ecc.) Verranno visualizzati come e.Key.ToString()

+0

Non funziona su cifre dal tastierino numerico. – Paparazzi

2

prova questo, funziona.

private void txbNumber_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key >= Key.D0 && e.Key <= Key.D9) ; // it`s number 
     else if (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ; // it`s number 
     else if (e.Key == Key.Escape || e.Key == Key.Tab || e.Key == Key.CapsLock || e.Key == Key.LeftShift || e.Key == Key.LeftCtrl || 
      e.Key == Key.LWin || e.Key == Key.LeftAlt || e.Key == Key.RightAlt || e.Key == Key.RightCtrl || e.Key == Key.RightShift || 
      e.Key == Key.Left || e.Key == Key.Up || e.Key == Key.Down || e.Key == Key.Right || e.Key == Key.Return || e.Key == Key.Delete || 
      e.Key == Key.System) ; // it`s a system key (add other key here if you want to allow) 
     else 
      e.Handled = true; // the key will sappressed 
    }