2012-11-05 11 views
8

Próbuję znaleźć dobrą alternatywę dla Numericbox w aplikacji kafelkowej Windows 8. Próbowałem użyć tego samego numericbox, który istnieje dla formularzy systemu Windows, ale dostałem błąd, mówiąc, że nie są one obsługiwane (?) Przez aplikacje systemu Windows 8. Zauważyłem, że element TextBox dla aplikacji kaflowych ma InputScope, który można ustawić na "Number", ale nadal pozwala użytkownikowi wpisać dowolną postać, którą chce. Zakładam, że InputScope nie robi tego, co myślę, że robi.Alternatywy dla Numericbox w aplikacjach Windows 8?

Obecnie zarządzam z polem tekstowym, ale ponieważ wykonuję obliczenia, tekst musi być ciągle konwertowany na dziesiętne, a następnie z powrotem do tekstu, gdy chcę zaktualizować interfejs, oprócz konieczności wykonania kilku kontroli, aby dokonać upewnij się, że użytkownik nie wprowadza znaków nieliczbowych. Jest to niezwykle uciążliwe i bardzo dobrze znane z Windows Form wydaje się być krokiem w złym kierunku. Muszę przegapić coś oczywistego?

+0

'InputScope' jest używany dla typu klawiatury wprowadzanej dotykiem. – BrunoLM

Odpowiedz

3

Nie jestem zaznajomiony z NumericTextBox, ale tutaj jest prosta implementacja C#/XAML, która pozwala tylko cyfry i dziesiętny charakter.

Wszystko to jest nadpisane zdarzeniem OnKeyDown; na podstawie wciśniętego klawisza zezwala lub nie pozwala wydarzenie dotrzeć do klasy podstawowej TextBox.

Muszę zauważyć, że ta implementacja dotyczy aplikacji Windows Store - wierzę, że twoje pytanie dotyczy tego typu aplikacji, ale nie jestem w 100% pewna.

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

Oto przykładowy XAML. Zauważ, że zakłada on, że MyNumericTextBox znajduje się w przestrzeni nazw projektu.

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

Po prostu uwaga, ten przykład nie obsługuje Shift + number, więc pozwala na przemykanie znaków specjalnych, także kropka dziesiętna może być dodana tylko raz, jeśli skasowana, nie może być dodana ponownie. – Dave