2012-11-05 3 views
8

Ich versuche, eine gute Alternative zu Numericbox in einer Windows 8-Kachel-Anwendung zu finden. Ich habe versucht, die gleiche numericbox, die für Windows-Formulare existiert, aber eine Fehlermeldung, dass diese nicht von Windows 8-Anwendungen (?) Unterstützt werden. Ich habe festgestellt, dass das TextBox-Element für Kachelanwendungen über ein InputScope verfügt, das auf "Number" eingestellt werden kann, aber es dem Benutzer dennoch ermöglicht, das gewünschte Zeichen einzugeben. Ich nehme an, dass das InputScope nicht das tut, was es meiner Meinung nach tut.Alternativen für Numericbox in Windows 8-Anwendungen?

Ich bin derzeit mit der Textbox verwalten, aber weil ich Berechnungen mache, muss der Text ständig in Dezimal konvertiert werden und dann zurück zu Text, wenn ich die Schnittstelle aktualisieren möchte, zusätzlich zu mehreren Prüfungen zu machen Sicher, dass der Benutzer keine nicht numerischen Zeichen eingibt. Dies wird extrem mühsam und mit Windows Form sehr vertraut, scheint dies ein Schritt in die falsche Richtung zu sein. Ich muss etwas Offensichtliches vermissen?

+0

'InputScope' wird für Tastatureingabe verwendet. – BrunoLM

Antwort

3

Ich bin nicht vertraut mit NumericTextBox, aber hier ist eine einfache C#/XAML-Implementierung, die nur Ziffern und das Dezimalzeichen erlaubt.

Alles, was es tut, überschreibt das OnKeyDown Ereignis; basierend auf der gedrückten Taste erlaubt oder verbietet es das Ereignis, die Basisklasse TextBox zu erreichen.

Ich sollte beachten, dass diese Implementierung für Windows Store-Apps ist - ich glaube, Ihre Frage ist über diese Art von App, aber ich bin mir nicht 100% sicher.

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

Hier ist ein Beispiel XAML. Beachten Sie, dass davon ausgegangen wird, dass sich MyNumericTextBox im Projektnamespace befindet.

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

Nur eine Anmerkung, dieses Beispiel berücksichtigt nicht die Umschalt + Nummer, und so erlaubt es den Sonderzeichen sich durchzuschleichen, auch der Dezimalpunkt kann nur einmal hinzugefügt werden, wenn er gelöscht wird, kann er nicht erneut hinzugefügt werden. – Dave