news 2026/2/7 6:18:37

022.WPF 封装TextBox控件限制只输入数字自定义属性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
022.WPF 封装TextBox控件限制只输入数字自定义属性

这是 WPF 中处理输入限制最健壮且最推荐的方式。

我将提供一个纯整数限制的附加属性,并确保它能处理键盘输入、粘贴和所有特殊情况。

利用自定义附加属性基类DependencyProperty封装一个附加属性传给textbox这个控件使用,

实际上自定义属性是可重复使用的,界面上的textbox都可以使用这个属性进行限制只能输入正整数和正浮点数

步骤一:创建附加属性类(自定义属性)

请在您的项目(例如NX_Openg.Control命名空间下)创建一个名为TextBoxBehavior.cs的文件,并粘贴以下代码:

using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace NX_Openg.Control { /// <summary> /// 提供TextBox的附加行为,用于限制输入为纯整数。 /// </summary> public static class TextBoxBehavior { public static readonly DependencyProperty IsIntegerProperty = DependencyProperty.RegisterAttached( "IsInteger", typeof(bool), typeof(TextBoxBehavior), new PropertyMetadata(false, OnIsIntegerChanged)); public static bool GetIsInteger(DependencyObject obj) { return (bool)obj.GetValue(IsIntegerProperty); } public static void SetIsInteger(DependencyObject obj, bool value) { obj.SetValue(IsIntegerProperty, value); } private static void OnIsIntegerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is TextBox textBox) { if ((bool)e.NewValue) { // 附加事件处理器:处理字符输入 textBox.PreviewTextInput += TextBox_PreviewTextInput; // 附加事件处理器:处理特殊按键 textBox.PreviewKeyDown += TextBox_PreviewKeyDown; // 附加事件处理器:专门处理粘贴操作 DataObject.AddPastingHandler(textBox, TextBox_Pasting); } else { // 移除事件处理器 textBox.PreviewTextInput -= TextBox_PreviewTextInput; textBox.PreviewKeyDown -= TextBox_PreviewKeyDown; DataObject.RemovePastingHandler(textBox, TextBox_Pasting); } } } // 负责过滤字符输入(包括输入法和粘贴的字符) private static void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { // 检查输入是否为数字 if (!char.IsDigit(e.Text, 0)) { e.Handled = true; // 阻止非数字字符 } } // 负责处理特殊按键(如 Backspace, Delete, 方向键, 空格) private static void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { // 1. 允许控制键:Back、Delete、Tab、Enter、方向键 if (e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Tab || e.Key == Key.Enter || (e.Key >= Key.Left && e.Key <= Key.Down)) { return; } // 2. 允许 Ctrl 组合键 (A, C, V, X) if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) { return; } // 3. 阻止空格键 if (e.Key == Key.Space) { e.Handled = true; return; } // 4. 阻止所有非数字按键(字母、符号等) // 注意:我们不在这里处理数字键,让它们继续触发 PreviewTextInput // 但如果是非数字键,且不是控制键,则直接阻止。 // 检查是否为数字键(主键盘和数字键盘) bool isDigit = (e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9); if (!isDigit) { e.Handled = true; } // 如果是数字键,我们让它通过,由 PreviewTextInput 再次确认 } // 专门处理粘贴操作,确保粘贴的内容是纯数字 private static void TextBox_Pasting(object sender, DataObjectPastingEventArgs e) { if (e.DataObject.GetDataPresent(typeof(string))) { string pasteText = (string)e.DataObject.GetData(typeof(string)); // 检查粘贴内容是否只包含数字 Regex regex = new Regex("^[0-9]+$"); if (!regex.IsMatch(pasteText)) { e.CancelCommand(); // 取消粘贴命令 } } else { e.CancelCommand(); // 取消非文本粘贴 } } } }

DependencyProperty

是系统自带的自定义属性封装基类,创建这个自定义属性对象可以封装我们自己所需功能的自定义属性,属性可以被wpf大部分控件随意调用,只不过,我们这个属性类封装的代码是用来处理键盘输入的,只能适用于textbox这类的输入控件

这个类我们封装了IsPositiveFloatProperty这个自定义属性对象,ui就是通过调用这个对象来使用自定义属性

步骤二:修改 XAML (应用附加属性)

1.引用自定义属性类所在文件夹的uri

xmlns:cjp="clr-namespace:NX_Openg.Control"

2.在您的TextBox上,应用新的附加属性cjp:类名.对象名="True"

<TextBox Name="text_d2" IsEnabled="{Binding ScrewInfo.Textbox2_look}" HorizontalAlignment="Left" Margin="303,67,0,0" TextWrapping="Wrap" Text="8" VerticalAlignment="Top" cjp:TextBoxBehavior.IsPositiveFloat="True" Width="120"/>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 7:00:48

MinerU镜像启动后无响应?HTTP按钮调试部署问题解决案例

MinerU镜像启动后无响应&#xff1f;HTTP按钮调试部署问题解决案例 1. 问题现场&#xff1a;点击HTTP按钮后页面空白、接口无返回 你兴冲冲地在CSDN星图镜像广场拉起 OpenDataLab/MinerU2.5-2509-1.2B 镜像&#xff0c;等进度条走完&#xff0c;满怀期待点下那个醒目的 HTTP按…

作者头像 李华
网站建设 2026/2/5 18:04:53

DeepSeek-R1-Distill-Llama-8B效果展示:AIME 2024 pass@1达50.4%实录

DeepSeek-R1-Distill-Llama-8B效果展示&#xff1a;AIME 2024 pass1达50.4%实录 你有没有试过让一个8B参数的模型&#xff0c;解出一道真正的AIME数学竞赛题&#xff1f;不是那种“看起来像数学题”的模拟题&#xff0c;而是2024年真实考卷里、连很多高中生都要卡壳的压轴题。…

作者头像 李华
网站建设 2026/2/7 1:18:47

从下载到训练,YOLO11镜像全流程演示

从下载到训练&#xff0c;YOLO11镜像全流程演示 1. 为什么用镜像跑YOLO11&#xff1f;省掉三天环境踩坑时间 你有没有试过&#xff1a; pip install ultralytics 后报错 torch not compatible with torchvision&#xff1b;下载完模型权重&#xff0c;发现路径写错八次才对上…

作者头像 李华
网站建设 2026/2/5 16:27:36

Qwen3-Reranker-0.6B多场景应用:专利无效检索中权利要求匹配重排

Qwen3-Reranker-0.6B多场景应用&#xff1a;专利无效检索中权利要求匹配重排 在知识产权实务中&#xff0c;专利无效宣告程序是技术对抗最激烈的战场之一。其中&#xff0c;如何从海量对比文件中精准定位与权利要求高度相关的段落&#xff0c;直接决定无效证据链的强弱。传统B…

作者头像 李华