using System; using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; namespace Gumming { public class IntBox : TextBox { #region MaxValue public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register("MaxValue", typeof(Decimal), typeof(IntBox), new PropertyMetadata(100000000m, OnMaxValueChanged, CoerceMaxValue)); public Decimal MaxValue { get { return (Decimal)GetValue(MaxValueProperty); } set { SetValue(MaxValueProperty, value); } } private static void OnMaxValueChanged(DependencyObject element, DependencyPropertyChangedEventArgs e) { var control = (IntBox)element; var maxValue = (Decimal)e.NewValue; } private static object CoerceMaxValue(DependencyObject element, Object baseValue) { var maxValue = (Decimal)baseValue; if (maxValue == Decimal.MaxValue) { return DependencyProperty.UnsetValue; } return maxValue; } #endregion #region Constructors /* * The default constructor */ public IntBox() { TextChanged += new TextChangedEventHandler(OnTextChanged); KeyDown += new KeyEventHandler(OnKeyDown); } #endregion #region Properties new public String Text { get { return base.Text; } set { base.Text = LeaveOnlyNumbers(value); } } #endregion #region Functions private bool IsNumberKey(Key inKey) { if (inKey < Key.D0 || inKey > Key.D9) { if (inKey < Key.NumPad0 || inKey > Key.NumPad9) { return false; } } return true; } private bool IsDelOrBackspaceOrTabKey(Key inKey) { return inKey == Key.Delete || inKey == Key.Back || inKey == Key.Tab; } private string LeaveOnlyNumbers(String inString) { String tmp = inString; foreach (char c in inString.ToCharArray()) { if (!System.Text.RegularExpressions.Regex.IsMatch(c.ToString(), "^[0-9]*$")) { tmp = tmp.Replace(c.ToString(), ""); } } int value = 0; int.TryParse(inString, out value); if (value > MaxValue) { base.Text = MaxValue.ToString(); return base.Text; } return tmp; } #endregion #region Event Functions protected void OnKeyDown(object sender, KeyEventArgs e) { e.Handled = !IsNumberKey(e.Key) && !IsDelOrBackspaceOrTabKey(e.Key); } protected void OnTextChanged(object sender, TextChangedEventArgs e) { base.Text = LeaveOnlyNumbers(Text); this.Select(this.Text.Length, 0); } #endregion } }