You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.4 KiB

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