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 PDF_Master.CustomControl { /// /// NumericUpDown.xaml 的交互逻辑 /// public partial class NumericUpDown : UserControl { public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(NumericUpDown), new PropertyMetadata("1")); /// /// 当前值 /// public double Value { get { return (double)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); if (value > Maximum) { SetValue(ValueProperty, Maximum); } else if (value < Minimum) { SetValue(ValueProperty, Minimum); } else { SetValue(ValueProperty, value); TextBox_Num.Text = Value.ToString(); } } } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(NumericUpDown), new PropertyMetadata(0.0, SelectedItemSourcePropertyChanged)); private static void SelectedItemSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as NumericUpDown; var value = (double)e.NewValue; if (control != null) { control.TextBox_Num.Text = Convert.ToString(value); } } /// /// 最大值 /// public double Maximum { get { return (double)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } } public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(9999.0)); /// /// 最小值 /// public double Minimum { get { return (double)GetValue(MinimumProperty); } set { SetValue(MinimumProperty, value); } } public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(0.0)); /// /// 增长步长 /// public double TickFrequency { get { return (double)GetValue(TickFrequencyProperty); } set { SetValue(TickFrequencyProperty, value); } } public static readonly DependencyProperty TickFrequencyProperty = DependencyProperty.Register("TickFrequency", typeof(double), typeof(NumericUpDown), new PropertyMetadata(1.0)); public Visibility ShowBtn { get { return (Visibility)GetValue(ShowBtnProperty); } set { SetValue(ShowBtnProperty, value); } } public static readonly DependencyProperty ShowBtnProperty = DependencyProperty.Register("ShowBtn", typeof(Visibility), typeof(NumericUpDown), new PropertyMetadata(Visibility.Visible)); public NumericUpDown() { InitializeComponent(); } private void Button_Add_Click(object sender, RoutedEventArgs e) { int num = 0; double targetvalue = 0; bool result = int.TryParse(this.TextBox_Num.Text.Trim(), out num); if (result) { targetvalue = num + TickFrequency; } else { targetvalue = Maximum; } if (targetvalue > Maximum) { targetvalue = Maximum; } this.TextBox_Num.Text = targetvalue.ToString(); Text = this.TextBox_Num.Text; Value = targetvalue; } private void Button_Sub_Click(object sender, RoutedEventArgs e) { int num = 0; double targetvalue = 0; bool result = int.TryParse(this.TextBox_Num.Text.Trim(), out num); if (result) { targetvalue = num - TickFrequency; } else { targetvalue = Minimum; } if (targetvalue < Minimum) { targetvalue = Minimum; } this.TextBox_Num.Text = targetvalue.ToString(); Text = this.TextBox_Num.Text; Value = targetvalue; } private void CountTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = new Regex("[^0-9]+").IsMatch(e.Text); } private void TextBox_Num_LostFocus(object sender, RoutedEventArgs e) { //校验输入的过程 放在失去焦点中,而不是放在放在文本变化事件中 //如果放在文本变化事件中 会影响用户正常的输入,体验比较别扭 CheckInput(); } /// /// 校验输入是否合法 /// private void CheckInput() { //控件未显示前不进行逻辑处理 避免初始化前卡顿 if (!this.IsLoaded) return; //int.TryParse("30.0000610351563"),字符串有小数点,会转换失败 double num = 0; if (/*this.TextBox_Num.Text == "" ||*/ !double.TryParse(this.TextBox_Num.Text, out num)) { this.TextBox_Num.Text = Minimum.ToString(); } if (double.Parse(this.TextBox_Num.Text) < Minimum) { this.TextBox_Num.Text = Minimum.ToString(); } Text = this.TextBox_Num.Text; Value = (int)double.Parse(this.TextBox_Num.Text); } private void TextBox_Num_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { CheckInput(); } } private void UserControl_Loaded(object sender, RoutedEventArgs e) { //修复控件初始化显示固定值的问题 if (Value >= Minimum) { Text = Value.ToString(); } } } }