Revision: 65266
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 13, 2013 18:30 by dck11
Initial Code
using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Text; using System.Windows; using System.Windows.Interactivity; using System.Windows.Controls; using System.Windows.Input; namespace TestTextBox { public class NumericTextBoxValidator : Behavior<TextBox> { public Type TargetType { get; set; } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Unloaded += ue_Unloaded; AssociatedObject.PreviewKeyDown += ue_PreviewKeyDown; AssociatedObject.PreviewTextInput += ue_PreviewTextInput; } protected override void OnDetaching() { AssociatedObject.Unloaded -= ue_Unloaded; AssociatedObject.PreviewKeyDown -= ue_PreviewKeyDown; } private void ue_PreviewTextInput(object sender, TextCompositionEventArgs e) { if (TargetType != null) { try { var resultingText = this.AssociatedObject.Text.Insert(this.AssociatedObject.CaretIndex, e.Text); Convert.ChangeType(resultingText, TargetType); } catch (Exception) { e.Handled = true; } } } private void ue_Unloaded(object sender, RoutedEventArgs e) { var ue = sender as FrameworkElement; if (ue == null) return; ue.Unloaded -= ue_Unloaded; ue.PreviewKeyDown -= ue_PreviewKeyDown; } private void ue_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) { var ue = AssociatedObject; if (e.Key == Key.Space) { e.Handled = true; } if (!IsKeyADigit(e.Key) && !IsKeyAllowedChar(e.Key) && e.Key != Key.Delete && e.Key != Key.Back && !IsNavigationKey(e.Key) && !IsControlKey(e.Key)) { e.Handled = true; } if (e.Key == Key.Back || e.Key == Key.Delete) { if (ue.SelectedText.Length == ue.Text.Length) { ue.Text = null; e.Handled = true; return; } if (ue.Text.Length == 1) { ue.Text = null; e.Handled = true; } } else if ((IsKeyADigit(e.Key) || IsKeyAllowedChar(e.Key)) && ue.SelectedText.Length == ue.Text.Length) { ue.Text = null; if (e.Key == Key.OemMinus || e.Key == Key.Subtract) { ue.Text = "-"; ue.SelectionStart = 1; e.Handled = true; } else if (e.Key == Key.OemPeriod || e.Key == Key.OemComma || e.Key == Key.Decimal) { ue.Text = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; ue.SelectionStart = 1; e.Handled = true; } } } private bool IsControlKey(Key key) { return key == Key.LeftCtrl || key == Key.RightCtrl || key == Key.RightAlt || key == Key.LeftAlt || key == Key.RightShift || key == Key.LeftShift; } private bool IsNavigationKey(Key key) { return key == Key.Left || key == Key.Right || key == Key.Return || key == Key.Down || key == Key.Up; } public static bool IsKeyADigit(Key key) { return (key >= Key.D0 && key <= Key.D9) || (key >= Key.NumPad0 && key <= Key.NumPad9); } public static bool IsKeyAllowedChar(Key key) { return (key == Key.OemMinus || key == Key.Subtract || key == Key.OemPeriod || key == Key.OemComma || key == Key.Decimal); } } }
Initial URL
Initial Description
behavior for validating numeric input
Initial Title
Numeric input validator behavior
Initial Tags
c#
Initial Language
C#