news 2026/5/30 18:52:42

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/5/29 23:49:22

Elasticsearch菜鸟教程:新手必看的入门基础指南

以下是对您提供的《Elasticsearch菜鸟教程》博文的 深度润色与重构版本 。我以一位有多年搜索平台实战经验、同时长期运营技术博客的工程师视角,对原文进行了全面升级: ✅ 彻底去除AI腔与教科书感 :删掉所有“本教程将……”“首先/其次/最后”等模板化表达,改用真实开…

作者头像 李华
网站建设 2026/5/28 20:38:15

SenseVoice Small在线教育应用:录播课→字幕+知识图谱节点提取教程

SenseVoice Small在线教育应用&#xff1a;录播课→字幕知识图谱节点提取教程 1. 为什么录播课需要“听懂”自己&#xff1f; 你有没有遇到过这样的情况&#xff1a;花几小时录了一节高质量的在线课程&#xff0c;结果发现学生反馈“听不清重点”“找不到知识点在哪”“回看时…

作者头像 李华
网站建设 2026/5/30 9:36:40

Qwen3-4B-Instruct多场景:支持技术写作、教育出题、产品策划三合一

Qwen3-4B-Instruct多场景&#xff1a;支持技术写作、教育出题、产品策划三合一 1. 为什么这款4B模型能真正“干活” 你有没有试过让AI写一段技术文档&#xff0c;结果通篇套话、逻辑断层、关键细节全错&#xff1f;或者让它出一套初中物理试卷&#xff0c;题目难度忽高忽低&a…

作者头像 李华
网站建设 2026/5/29 1:57:05

5分钟上手IndexTTS 2.0!零样本语音合成,小白也能做配音

5分钟上手IndexTTS 2.0&#xff01;零样本语音合成&#xff0c;小白也能做配音 你是不是也遇到过这些情况&#xff1a; 剪完一段30秒的vlog&#xff0c;卡在配音环节——找外包太贵&#xff0c;自己念又没感情&#xff1b; 想给游戏角色配个专属声线&#xff0c;结果试了三款T…

作者头像 李华
网站建设 2026/5/28 20:35:05

一个小脚本,解决了大问题——开机自启实录

一个小脚本&#xff0c;解决了大问题——开机自启实录 你有没有遇到过这样的场景&#xff1a;服务器重启后&#xff0c;那个关键的服务没起来&#xff0c;业务直接中断&#xff1b;或者开发环境里&#xff0c;每次开机都要手动敲三四条命令才能让项目跑起来&#xff1b;又或者…

作者头像 李华
网站建设 2026/5/28 22:56:59

DASD-4B-Thinking实战落地:vLLM模型服务SLA保障+Chainlit用户体验监控

DASD-4B-Thinking实战落地&#xff1a;vLLM模型服务SLA保障Chainlit用户体验监控 1. 为什么需要一个“会思考”的4B小模型&#xff1f; 你有没有遇到过这样的情况&#xff1a;想让AI解决一道数学题&#xff0c;它直接给答案&#xff0c;但中间步骤全靠猜&#xff1b;写一段Py…

作者头像 李华