WPF, Silverlight, Windows Phone 8 und Windows Store Apps

XAML: Numeric TextBox
Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und Fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „XAML: Numeric TextBox“. Viel Spaß mit XAML Expertise.

Dieses Beispiel zeigt, wie alphabetische oder symbolische Eingaben bei einer TextBox verhindert werden. Leider wird dieses Feature nicht von Haus aus bereitgestellt. Gerade für Anwendungen, die an bestimmten Stellen nur Zahlen entgegennehmen dürfen, ist es aber sehr nützlich, um Laufzeitfehler zu verhindern. Um diese Lösung mit wenigen Zeilen Code umzusetzen, muss nur das PreviewTextInput-Event abonniert werden. Dieses wird ausgelöst, sobald eine Tasteneingabe innerhalb vom Steuerelement stattgefunden hat und bevor die Eingabe dargestellt wird. Dann wird jedes Zeichen der Eingabe mit der statischen Methode Char.IsNumber überprüft. Sollte ein Zeichen nicht einer Zahl entsprechen, wird das Routed-Event durch e.Handled = true beendet. Das bedeutet, die Weitergabe der Texteingabe wird unterbrochen und das Steuerelement verändert sich nicht. Die Lösung kann ganz einfach als Behavior oder Attached Property geschrieben werden. Der Code aus Listing 1 zeigt ein Attached Property. Bei Listing 2 sieht man dann, wie einfach dieses bei einer TextBox eingesetzt wird.

public class NumericTextBox : UserControl
{
  public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof (bool), typeof (NumericTextBox), new PropertyMetadata(PropertyChanged));

  private static void PropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
  {
    TextBox textBox = (TextBox) dependencyObject;
    textBox.PreviewTextInput += OnPreviewTextInput;
  }

  private static void OnPreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
  {
    if (GetIsEnabled((TextBox) sender))
    {
      foreach (char charItem in e.Text)
      {
        if (!Char.IsNumber(charItem))
        {
          e.Handled = true;
        }
      }
    }
  }

  public static bool GetIsEnabled(TextBox textBox)
  {
    return (bool) textBox.GetValue(IsEnabledProperty);
  }

  public static void SetIsEnabled(TextBox textBox, bool isEnabled)
  {
    textBox.SetValue(IsEnabledProperty, isEnabled);
  }
}

 

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -