using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Aucma.Core.PrintTo.Views.Page { /// /// NumUpDown.xaml 的交互逻辑 /// public partial class NumUpDown : UserControl { public NumUpDown() { InitializeComponent(); } /// /// 当前值 /// private decimal AvaliableVal = 0; /// /// Sync Resource /// private static object lockObj = new object(); /// /// label 显示内容 /// public string LabeContent { get { return GetValue(LabeContentProperty).ToString(); } set { SetValue(LabeContentProperty, value); } } /// /// 最小值 /// public decimal MinValue { get { return Convert.ToDecimal(GetValue(MinValueProperty)); } set { SetValue(MinValueProperty, value); } } /// /// 最大值 /// public decimal MaxValue { get { return Convert.ToDecimal(GetValue(MaxValueProperty)); } set { SetValue(MaxValueProperty, value); } } /// /// 默认值 /// public decimal DefaultValue { get { return Convert.ToDecimal(GetValue(DefaultValueProperty)); } set { SetValue(DefaultValueProperty, value); NumericValue = DefaultValue; } } /// /// 是否整数 /// public bool IsInteger { get { return Convert.ToBoolean(GetValue(IsIntegerProperty)); } set { SetValue(IsIntegerProperty, value); } } /// /// 步长 /// public decimal OffsetValue { get { return Convert.ToDecimal(GetValue(OffsetValueProperty)); } set { SetValue(OffsetValueProperty, value); } } /// /// 输入框值 /// public decimal NumericValue { get { return Convert.ToDecimal(GetValue(NumericValueProperty)); } set { SetValue(NumericValueProperty, value); } } /// /// 左侧的Label的宽度 /// public double LabelWidth { get { return Convert.ToDouble(GetValue(LabelWidthValueProperty)); } set { SetValue(LabelWidthValueProperty, value); } } /// /// 标签的可见性 /// public string LabelVisibility { get { return Convert.ToString(GetValue(LabelVisibilityValueProperty)); } set { SetValue(LabelVisibilityValueProperty, value); } } public static readonly DependencyProperty LabeContentProperty = DependencyProperty.Register("LabeContent", typeof(string), typeof(NumUpDown), new PropertyMetadata("", new PropertyChangedCallback(LabelContentCallback)) ); private static void LabelContentCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) { NumUpDown control = obj as NumUpDown; //control.myNumLabelName.Content = e.NewValue.ToString(); } public static readonly DependencyProperty MinValueProperty = DependencyProperty.Register("MinValue", typeof(decimal), typeof(NumUpDown), new PropertyMetadata(-1m, null) ); public static readonly DependencyProperty MaxValueProperty = DependencyProperty.Register("MaxValue", typeof(decimal), typeof(NumUpDown), new PropertyMetadata(-1m, new PropertyChangedCallback(MaxValueChangedCallback)) ); public static readonly DependencyProperty DefaultValueProperty = DependencyProperty.Register("DefaultValue", typeof(decimal), typeof(NumUpDown) ); public static readonly DependencyProperty IsIntegerProperty = DependencyProperty.Register("IsInteger", typeof(bool), typeof(NumUpDown), new PropertyMetadata(false) ); public static readonly DependencyProperty OffsetValueProperty = DependencyProperty.Register("OffsetValue", typeof(decimal), typeof(NumUpDown), new PropertyMetadata(1m) ); public static readonly DependencyProperty NumericValueProperty = DependencyProperty.Register("NumericValue", typeof(decimal), typeof(NumUpDown), new PropertyMetadata(new PropertyChangedCallback(NumericValueChangedCallback)) ); public static readonly DependencyProperty LabelWidthValueProperty = DependencyProperty.Register("LabelWidth", typeof(double), typeof(NumUpDown), new PropertyMetadata(0.0, new PropertyChangedCallback(LabelWidthCallback)) ); public static readonly DependencyProperty LabelVisibilityValueProperty = DependencyProperty.Register("LabelVisibility", typeof(string), typeof(NumUpDown), new PropertyMetadata("Visible", new PropertyChangedCallback(LabelVisibilityCallback)) ); private static void LabelWidthCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) { NumUpDown control = obj as NumUpDown; //control.myNumLabelName.Width = double.Parse(string.IsNullOrEmpty(e.NewValue.ToString()) ? "0" : e.NewValue.ToString()); } private static void LabelVisibilityCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) { NumUpDown control = obj as NumUpDown; string visi = e.NewValue.ToString(); //if (visi.Equals(Visibility.Visible.ToString())) // control.myNumLabelName.Visibility = Visibility.Visible; //else if (visi.Equals(Visibility.Hidden.ToString())) // control.myNumLabelName.Visibility = Visibility.Hidden; //else // control.myNumLabelName.Visibility = Visibility.Collapsed; } private static void MaxValueChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) { NumUpDown control = obj as NumUpDown; control.tbContent.MaxLength = e.NewValue.ToString().Length; } private static void NumericValueChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e) { NumUpDown control = obj as NumUpDown; control.AvaliableVal = Convert.ToDecimal(e.NewValue); control.tbContent.Text = e.NewValue.ToString(); control.tbContent.SelectionStart = control.tbContent.Text.Length; } /// /// 增加按钮 /// /// /// private void btnAddClick(object sender, RoutedEventArgs e) { decimal offsetValue = OffsetValue; AvaliableVal = Convert.ToDecimal(tbContent.Text); decimal newValue; if (AvaliableVal > MaxValue) { NumericValue = MaxValue; return; } if (AvaliableVal + offsetValue > MaxValue) { NumericValue = MaxValue; return; } newValue = AvaliableVal + offsetValue; if (newValue < MinValue) { NumericValue = MinValue; return; } if (IsInteger) newValue = decimal.Parse(newValue.ToString("0")); else newValue = decimal.Parse(newValue.ToString("0.######")); tbContent.Text = newValue.ToString(); NumericValue = newValue; } /// /// 减少按钮 /// /// /// private void btnSubClick(object sender, RoutedEventArgs e) { AvaliableVal = Convert.ToDecimal(tbContent.Text); if (AvaliableVal < MinValue) { NumericValue = MinValue; return; } if (AvaliableVal - OffsetValue < MinValue) { NumericValue = MinValue; return; } if (AvaliableVal > MaxValue) { NumericValue = MaxValue; return; } decimal newValue; newValue = AvaliableVal - OffsetValue; if (IsInteger) newValue = decimal.Parse(newValue.ToString("0")); else newValue = decimal.Parse(newValue.ToString("0.######")); tbContent.Text = newValue.ToString(); NumericValue = newValue; } /// /// 获取焦点 /// /// /// private void tbContentGotFocus(object sender, RoutedEventArgs e) { TextBox tb = sender as System.Windows.Controls.TextBox; this.AvaliableVal = Convert.ToDecimal(tb.Text); } /// /// 是否数字 /// /// /// private bool IsNumber(string input) { string pattern = "^-?\\d+$|^(-?\\d+)(\\.\\d+)?$"; Regex regex = new Regex(pattern); return regex.IsMatch(input); } /// /// 是否整数 /// /// /// private bool IsWholeNumber(string strNumber) { Regex g = new Regex(@"^[0-9]\d*$"); return g.IsMatch(strNumber); } /// /// 数字Text变动Event /// /// /// private void tbContentTextChanged(object sender, TextChangedEventArgs e) { lock (lockObj) { TextBox tb = sender as TextBox; if (tb != null) { bool isNumeric = IsNumber(tb.Text); if (isNumeric) { var vv = Convert.ToDecimal(tb.Text); if (vv > MaxValue && MaxValue != -1) { //此句为了解决实际应用时数据刷新的问题 NumericValue = MaxValue - 1; try { System.Threading.Thread.Sleep(0); } catch { } NumericValue = MaxValue; return; } NumericValue = vv; } else { //NumericValue = null; } } } } /// /// Lost焦点事件处理 /// /// /// private void tbCntLostFocus(object sender, RoutedEventArgs e) { lock (lockObj) { TextBox tb = sender as TextBox; bool isNumeric = IsNumber(tb.Text); if (isNumeric && IsInteger) { isNumeric = IsWholeNumber(tb.Text); } decimal oldValue = this.AvaliableVal; if (isNumeric) { decimal ctrlValue = Convert.ToDecimal(tb.Text); if (ctrlValue < MinValue) { if (oldValue <= MaxValue && oldValue >= MinValue) NumericValue = oldValue; else NumericValue = MinValue; AvaliableVal = NumericValue; } else if (ctrlValue > MaxValue) { if (oldValue <= MaxValue && oldValue >= MinValue) NumericValue = oldValue; else NumericValue = MaxValue; AvaliableVal = NumericValue; } else { AvaliableVal = ctrlValue; NumericValue = AvaliableVal; } } else { if (oldValue > MaxValue || oldValue < MinValue) oldValue = DefaultValue; tb.Text = oldValue.ToString(); NumericValue = oldValue; } } } } }