using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; 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 WpfControlLibrary.NumbericTextbox { /// /// numTextbox.xaml 的交互逻辑 /// public partial class numTextbox : UserControl { public numTextbox() { InitializeComponent(); } // 定义依赖属性 public static readonly DependencyProperty CustomTextProperty = DependencyProperty.Register( "CustomText", typeof(string), typeof(numTextbox), new PropertyMetadata(default(string), OnCustomTextChanged) ); private static void OnCustomTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = d as numTextbox; if ( control.Textbox.Text != e.NewValue.ToString() ) { control.Textbox.Text = e.NewValue.ToString(); // 同步到控件内部属性 } } // CLR 属性包装器 public string CustomText { get { return ( string ) GetValue(CustomTextProperty); } set { SetValue(CustomTextProperty, value); } } private void TextBox_KeyDown(object sender, KeyEventArgs e) { TextBox txt = sender as TextBox; //屏蔽非法按键 if ( ( e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9 ) || e.Key == Key.Decimal ) { if ( txt.Text.Contains(".") && e.Key == Key.Decimal ) { e.Handled = true; return; } e.Handled = false; } else if ( ( ( e.Key >= Key.D0 && e.Key <= Key.D9 ) || e.Key == Key.OemPeriod ) && e.KeyboardDevice.Modifiers != ModifierKeys.Shift ) { if ( txt.Text.Contains(".") && e.Key == Key.OemPeriod ) { e.Handled = true; return; } e.Handled = false; } else { e.Handled = true; } } private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { //屏蔽中文输入和非法字符粘贴输入 TextBox textBox = sender as TextBox; TextChange[] change = new TextChange[e.Changes.Count]; e.Changes.CopyTo(change, 0); int offset = change[0].Offset; if ( change[ 0 ].AddedLength > 0 ) { double num = 0; if ( !Double.TryParse(textBox.Text, out num) ) { textBox.Text = textBox.Text.Remove(offset, change[ 0 ].AddedLength); textBox.Select(offset, 0); } } CustomText = textBox.Text; } } }