wpf 只能输入int类型的文本框

我做的这个文本框,可设置最大值,最小值,有失去焦点事件的话,失去焦点文本框里的数字是你上次填的数字,避免数据为空的情况。

有失去焦点事件

cs 复制代码
using System.Windows.Input;
using System.Windows;
using System.Windows.Controls;

namespace 项目名
{
    public class IntegerTextBox : TextBox
    {
        public bool isMouseEntered = false;

        public string PreviousText
        {
            get { return (string)GetValue(PreviousTextProperty); }
            set { SetValue(PreviousTextProperty, value); }
        }
        public static readonly DependencyProperty PreviousTextProperty =
            DependencyProperty.Register("PreviousText", typeof(string), typeof(IntegerTextBox), new PropertyMetadata(string.Empty));

        public string HistoryText
        {
            get { return (string)GetValue(HistoryTextProperty); }
            set { SetValue(HistoryTextProperty, value); }
        }
        public static readonly DependencyProperty HistoryTextProperty = DependencyProperty.Register("HistoryText", typeof(string), typeof(IntegerTextBox), new PropertyMetadata(string.Empty));

        public int? MinValue
        {
            get { return (int?)GetValue(MinValueProperty); }
            set { SetValue(MinValueProperty, value); }
        }

        public static readonly DependencyProperty MinValueProperty =
            DependencyProperty.Register("MinValue", typeof(int?), typeof(IntegerTextBox));

        public int MaxValue
        {
            get { return (int)GetValue(MaxValueProperty); }
            set { SetValue(MaxValueProperty, value); }
        }

        public static readonly DependencyProperty MaxValueProperty =
        DependencyProperty.Register("MaxValue", typeof(int), typeof(IntegerTextBox), new PropertyMetadata(int.MaxValue));

        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsGotFocusProperty);
        }

        public static void SetIsEnabled(DependencyObject obj, bool value)
        {
            obj.SetValue(IsGotFocusProperty, value);
        }

        public bool IsNeedLoseFucos
        {
            get { return (bool)GetValue(IsNeedLoseFucosvProperty); }
            set { SetValue(IsNeedLoseFucosvProperty, value); }
        }
        public static readonly DependencyProperty IsNeedLoseFucosvProperty =
            DependencyProperty.RegisterAttached("IsNeedLoseFucos", typeof(bool), typeof(IntegerTextBox), new PropertyMetadata(true));

        public bool IsGotFocus
        {
            get { return (bool)GetValue(IsGotFocusProperty); }
            set { SetValue(IsGotFocusProperty, value); }
        }
        public static readonly DependencyProperty IsGotFocusProperty =
            DependencyProperty.RegisterAttached("IsGotFocus", typeof(bool), typeof(IntegerTextBox), new PropertyMetadata(false));

        static IntegerTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(IntegerTextBox), new FrameworkPropertyMetadata(typeof(IntegerTextBox)));
        }

        public IntegerTextBox()
        {
            LostFocus += IntegerTextBox_LostFocus;
            PreviewTextInput += IntegerTextBox_PreviewTextInput;
        }

        private void IntegerTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            Text = Text.Trim();
            string txt = Text + e.Text;
            if (txt.Length > 1 && txt.StartsWith('0'))
            {
                Text = Text.Substring(1);
            }
            if (!int.TryParse(txt, out int value))
            {
                if (!string.IsNullOrWhiteSpace(Text))
                {
                    var index = Text.IndexOf(e.Text);
                    if (index > -1) { Text = Text.Remove(index); }

                    SelectionStart = Text.Length + e.Text.Length;
                }
                e.Handled = true; // 阻止输入非数字字符
            }
            //else if (value < MinValue && value.ToString().Length == MinValue.ToString().Length)
            //{
            //    Text = MinValue.ToString(); // 将文本框的值设置为最小值
            //    SelectionStart = Text.Length + e.Text.Length;
            //    e.Handled = true; // 阻止输入超出取值范围的数字
            //}
            else if (value > MaxValue)
            {
                Text = MaxValue.ToString(); // 将文本框的值设置为最大值
                SelectionStart = Text.Length + e.Text.Length;
                e.Handled = true; // 阻止输入超出取值范围的数字
            }
            else
            {
                Text = value.ToString();
                SelectionStart = Text.Length + e.Text.Length;
                e.Handled = true;
            }
            SelectionStart = Text.Length + e.Text.Length;
            HistoryText = Text;
        }

        private void IntegerTextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            IsGotFocus = false;

            Text = Text.Trim();
            if (string.IsNullOrEmpty(Text))
            {
                if (!string.IsNullOrEmpty(HistoryText) && int.TryParse(HistoryText, out int history) && history > MinValue)
                {
                    Text = HistoryText;
                }
                else if (!string.IsNullOrEmpty(PreviousText))
                {
                    Text = PreviousText;
                }
                else if (MinValue is not null)
                {
                    Text = MinValue.Value.ToString();
                }
            }
            else
            {
                if (int.TryParse(Text, out int num))
                {
                    if (num < MinValue)
                    {
                        if (!string.IsNullOrEmpty(HistoryText) && int.TryParse(HistoryText, out int history) && history > MinValue)
                        {
                            Text = HistoryText;
                        }
                        else
                        {
                            Text = MinValue.ToString();
                        }
                    }
                    else if (num > MaxValue)
                    {
                        if (!string.IsNullOrEmpty(HistoryText) && int.TryParse(HistoryText, out int history) && history < MaxValue)
                        {
                            Text = HistoryText;
                        }
                        else if (!string.IsNullOrEmpty(PreviousText))
                        {
                            Text = PreviousText;
                        }
                        else
                        {
                            Text = MaxValue.ToString();
                        }
                    }
                }
            }
            SelectionStart = Text.Length;
        }
    }
}

没有失去焦点事件:

cs 复制代码
public class IntegerTextBoxNoLF : TextBox
    {
        public bool isMouseEntered = false;

        public string PreviousText
        {
            get { return (string)GetValue(PreviousTextProperty); }
            set { SetValue(PreviousTextProperty, value); }
        }
        public static readonly DependencyProperty PreviousTextProperty =
            DependencyProperty.Register("PreviousText", typeof(string), typeof(IntegerTextBoxNoLF), new PropertyMetadata(string.Empty));

        public string HistoryText
        {
            get { return (string)GetValue(HistoryTextProperty); }
            set { SetValue(HistoryTextProperty, value); }
        }
        public static readonly DependencyProperty HistoryTextProperty = DependencyProperty.Register("HistoryText", typeof(string), typeof(IntegerTextBoxNoLF), new PropertyMetadata(string.Empty));

        public int? MinValue
        {
            get { return (int?)GetValue(MinValueProperty); }
            set { SetValue(MinValueProperty, value); }
        }

        public static readonly DependencyProperty MinValueProperty =
            DependencyProperty.Register("MinValue", typeof(int?), typeof(IntegerTextBoxNoLF));

        public int MaxValue
        {
            get { return (int)GetValue(MaxValueProperty); }
            set { SetValue(MaxValueProperty, value); }
        }

        public static readonly DependencyProperty MaxValueProperty =
        DependencyProperty.Register("MaxValue", typeof(int), typeof(IntegerTextBoxNoLF), new PropertyMetadata(int.MaxValue));

        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsGotFocusProperty);
        }

        public static void SetIsEnabled(DependencyObject obj, bool value)
        {
            obj.SetValue(IsGotFocusProperty, value);
        }

        public bool IsNeedLoseFucos
        {
            get { return (bool)GetValue(IsNeedLoseFucosvProperty); }
            set { SetValue(IsNeedLoseFucosvProperty, value); }
        }
        public static readonly DependencyProperty IsNeedLoseFucosvProperty =
            DependencyProperty.RegisterAttached("IsNeedLoseFucos", typeof(bool), typeof(IntegerTextBoxNoLF), new PropertyMetadata(true));

        public bool IsGotFocus
        {
            get { return (bool)GetValue(IsGotFocusProperty); }
            set { SetValue(IsGotFocusProperty, value); }
        }
        public static readonly DependencyProperty IsGotFocusProperty =
            DependencyProperty.RegisterAttached("IsGotFocus", typeof(bool), typeof(IntegerTextBoxNoLF), new PropertyMetadata(false));


        static IntegerTextBoxNoLF()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(IntegerTextBoxNoLF), new FrameworkPropertyMetadata(typeof(IntegerTextBoxNoLF)));
        }

        public IntegerTextBoxNoLF()
        {
            PreviewTextInput += IntegerTextBox_PreviewTextInput;
            //PreviewMouseLeftButtonDown += IntegerTextBox_PreviewMouseLeftButtonDown;
        }

        private void IntegerTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            Text = Text.Trim();
            string txt = Text + e.Text;
            if (txt.Length > 1 && txt.StartsWith('0'))
            {
                Text = Text.Substring(1);
            }
            if (!int.TryParse(txt, out int value))
            {
                if (!string.IsNullOrWhiteSpace(Text))
                {
                    var index = Text.IndexOf(e.Text);
                    if (index > -1) { Text = Text.Remove(index); }

                    SelectionStart = Text.Length + e.Text.Length;
                }
                e.Handled = true; // 阻止输入非数字字符
            }
            else if (value < MinValue && value.ToString().Length == MinValue.ToString().Length)
            {
                Text = MinValue.ToString(); // 将文本框的值设置为最小值
                SelectionStart = Text.Length + e.Text.Length;
                e.Handled = true; // 阻止输入超出取值范围的数字
            }
            else if (value > MaxValue)
            {
                Text = MaxValue.ToString(); // 将文本框的值设置为最大值
                SelectionStart = Text.Length + e.Text.Length;
                e.Handled = true; // 阻止输入超出取值范围的数字
            }
            else
            {
                Text = value.ToString();
                SelectionStart = Text.Length + e.Text.Length;
                e.Handled = true;
            }
            SelectionStart = Text.Length + e.Text.Length;
            HistoryText = Text;
        }

        private void IntegerTextBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Text = string.Empty;
            Focusable = true;
            Focus();
            IsGotFocus = true;
        }
    }

调用:

cs 复制代码
<local:IntegerTextBox MinValue="0" MaxValue="59" TextAlignment="Center" Width="120" Height="48" Text="{Binding Program.VibrationHour,TargetNullValue={x:Static sys:String.Empty}}" VerticalContentAlignment="Center" InputMethod.IsInputMethodEnabled="False" />
相关推荐
主宰者6 小时前
WPF外部打开html文件
前端·html·wpf
code bean6 小时前
【wpf】WPF 自定义控件绑定数据对象的最佳实践
wpf
code bean7 小时前
【wpf】WPF开发避坑指南:单例模式中依赖注入导致XAML设计器崩溃的解决方案
单例模式·wpf
somethingGoWay7 小时前
wpf 自定义控件,只能输入小数点,并且能控制小数点位数
wpf
我要打打代码12 小时前
wpf触发器
java·linux·wpf
The Sheep 202315 小时前
WPF里的几何图形Path绘制
wpf
somethingGoWay16 小时前
wpf 自定义密码文本框,并且可以双向绑定
wpf
玉面小君1 天前
从 WPF 到 Avalonia 的迁移系列实战篇4:控件模板与 TemplatedControl
wpf
何双新1 天前
第 2 讲:Kafka Topic 与 Partition 基础
kafka·wpf·linq