2012-11-05 11 views
8

Sto cercando di trovare una buona alternativa a Numericbox in un'applicazione tile di Windows 8. Ho provato a utilizzare lo stesso numericbox esistente per i moduli di Windows ma ho ricevuto un errore che diceva che non sono supportati (?) Dalle applicazioni di Windows 8. Ho notato che l'elemento TextBox per le applicazioni tile ha un InputScope che può essere impostato su "Numero", ma consente comunque all'utente di digitare qualsiasi carattere desideri. Presumo che InputScope non faccia quello che penso che faccia.Alternative per Numericbox nelle app di Windows 8?

Attualmente sto gestendo con la casella di testo, ma poiché sto facendo calcoli il testo deve essere costantemente convertito in decimale e quindi tornare al testo quando voglio aggiornare l'interfaccia, oltre a dover eseguire diversi controlli per rendere sicuro che l'utente non inserisca caratteri non numerici. Questo sta diventando estremamente noioso ed essendo molto familiare con Windows Form questo sembra essere un passo nella direzione sbagliata. Devo mancare qualcosa di ovvio?

+0

'InputScope' è utilizzato per il tipo di tastiera con immissione a tocco. – BrunoLM

risposta

3

Non ho familiarità con NumericTextBox, ma qui è una semplice implementazione C#/XAML che consente solo cifre e il carattere decimale.

Tutto ciò che fa è ignorare l'evento OnKeyDown; in base alla pressione del tasto, consente o non consente all'evento di raggiungere la classe TextBox di base.

Devo notare che questa implementazione è per le app di Windows Store - Credo che la tua domanda riguardi quel tipo di app, ma non ne sono sicuro al 100%.

public class MyNumericTextBox : TextBox 
{ 
    protected override void OnKeyDown(KeyRoutedEventArgs e) 
    { 
     HandleKey(e); 

     if (!e.Handled) 
      base.OnKeyDown(e); 
    } 

    bool _hasDecimal = false; 
    private void HandleKey(KeyRoutedEventArgs e) 
    { 
     switch (e.Key) 
     { 
      // allow digits 
      // TODO: keypad numeric digits here 
      case Windows.System.VirtualKey.Number0: 
      case Windows.System.VirtualKey.Number1: 
      case Windows.System.VirtualKey.Number2: 
      case Windows.System.VirtualKey.Number3: 
      case Windows.System.VirtualKey.Number4: 
      case Windows.System.VirtualKey.Number5: 
      case Windows.System.VirtualKey.Number6: 
      case Windows.System.VirtualKey.Number7: 
      case Windows.System.VirtualKey.Number8: 
      case Windows.System.VirtualKey.Number9: 
       e.Handled = false; 
       break; 

      // only allow one decimal 
      // TODO: handle deletion of decimal... 
      case (Windows.System.VirtualKey)190: // decimal (next to comma) 
      case Windows.System.VirtualKey.Decimal: // decimal on key pad 
       e.Handled = (_hasDecimal == true); 
       _hasDecimal = true; 
       break; 

      // pass various control keys to base 
      case Windows.System.VirtualKey.Up: 
      case Windows.System.VirtualKey.Down: 
      case Windows.System.VirtualKey.Left: 
      case Windows.System.VirtualKey.Right: 
      case Windows.System.VirtualKey.Delete: 
      case Windows.System.VirtualKey.Back: 
      case Windows.System.VirtualKey.Tab: 
       e.Handled = false; 
       break; 

      default: 
       // default is to not pass key to base 
       e.Handled = true; 
       break; 
     } 
    } 
} 

Ecco alcuni esempi di XAML. Si noti che si assume che MyNumericTextBox si trovi nello spazio dei nomi del progetto.

<StackPanel Background="Black"> 
    <!-- custom numeric textbox --> 
    <local:MyNumericTextBox /> 
    <!-- normal textbox --> 
    <TextBox /> 
</StackPanel> 
+0

Solo una nota, questo esempio non soddisfa Shift + numero, e quindi permette ai personaggi speciali di intrufolarsi, inoltre il punto decimale può essere aggiunto solo una volta, se cancellato non può essere aggiunto di nuovo. – Dave

Problemi correlati