浅谈WPF中的PreviewTextInput
今天在使用TextBox的TextInput事件的时候,发现无论如何都不能触发该事件,然后百思不得其解,最后在MSDN上找到了答案:TextInput 事件可能已被标记为由复合控件的内部实现进行处理。例如,TextBox 就是这样一个控件:在其组合期间已将 TextInput 事件标记为已处理。之所以这么做是因为,控件需要将某些类型的输入(如箭头键)解释为对该控件具有特殊含义。如果将 PreviewTextInput 事件用于为文本输入附加处理程序,则会获得更好的效果。该技术可以应对控件组合将此事件标识为已处理的大多数情况,并可防止处理程序在事件路由过程中接收该事件。也就是该冒泡事件在组合期间已经将e.Handled=true;所以事件是无法路由到这一层,所以无法响应,所以在使用TextInput的时候应当使用PreviewTextInput 事件而不是TextInput 事件,另外假如当前文本框内已经输入“12”,然后需要再输入3的时候会触发这一事件,此时如何我们将e.Handled=true,那么TextBox是不会有任何显示的,所以这也给我们很多的启发,例如我们可以在该事件中判断当前输入值是否是我们想要的数字。
private void This_TextInput(object sender, TextCompositionEventArgs e)
{
string newText = e.Text;
int number;
if (int.TryParse(e.Text, out number) && number > )
{
e.Handled = false;
}
else
{
e.Handled = true;//(这一行代码非常重要,决定能否显示当前输入的内容)
} }
所以在我们的TextBox判断是否是我们需要的结果从而决定是否去显示该字符串的时候,我们需要使用TextInput事件而不是使用TextChanged事件,这里面e.Text是添加的字符,比如用输入法输入“你好吗”时,这个事件会触发三次,e.Text分别为:你、好、吗。当然我在第一次使用的时候,用了一种替代的方法,用了TextChanged事件,这里也贴出代码,事实上这是一个很大的错误,当然功能可以完全实现,这里也贴出代码,仅供参考。
private void tb_tempreture_TextChanged(object sender, TextChangedEventArgs e)
{
string currentText = this.tb_tempreture.Text;
if (!string.IsNullOrEmpty(currentText))
{
int length = currentText.Length;
string lastChar = currentText.Substring(length - 1);
Regex regex = new Regex("^[0-9]*$");
Match match = regex.Match(lastChar);
bool isNumber = !string.IsNullOrEmpty(match.ToString());
int ascall = (int)Convert.ToChar(lastChar);
//如果输入的不是中文或者英文或者顿号的情况下弹出如下警告
if (!(ascall == 045 || ascall == 043 || isNumber))
{
MessageBox.Show("字符" + "'" + lastChar + "'" + "不是有效输入," + "请输入数字,或者是输入表示温度的‘+’和‘-’!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
this.tb_tempreture.Text = currentText.Substring(0, length - 1);
this.tb_tempreture.Select(currentText.Length,0);//每次改变之后设置光标的位置为文字的最后面
}
} }
这里面是判断输入的是否是数字以及“+”“—”号,这里面有两点需要注意:1 使用Convert.ToChar()的时候实际上是将结果转换成char对应的Unicode字符,所以要注意Convert.ToChar()的用法。2 弹出MessageBox时候,输入框的输入焦点会自动回到最前面,所以必须手动将焦点移到最新的输入位置,这里使用this.tb_tempreture.Select(currentText.Length,0);//每次改变之后设置光标的位置为文字的最后面。
浅谈WPF中的PreviewTextInput的更多相关文章
- 浅谈WPF中对控件的位图特效(WPF Bitmap Effects)
原文:浅谈WPF中对控件的位图特效(WPF Bitmap Effects) -------------------------------------------------------------- ...
- 浅谈WPF中的MVVM框架--MVVMFoundation
先科普一下:什么是WPF,请看下图 微软对于WPF技术的构想是很宏大的,可惜普及率不高,不过如果你要做Windows客户端开发的话WPF技术还是值得一学的. 什么是MVVM模式 简单来说它是一种高级的 ...
- 浅谈WPF页间导航
浅谈WPF页间导航 使用导航的目的是从一个页面进入到另一个页面.无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有3种方法实现:调用Naviga ...
- 浅谈WPF依赖项属性
浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
随机推荐
- Ubuntu 14.04 安装 CUDA 问题及解决
本文安装环境: - 双显卡: intel 集显 + nvidia 独显 - Ubuntu 14.04.4 - CUDA 8.0.44 1. Deb 安装包是个坑 (不要用这种方法!) 使用 Deb 安 ...
- spring-config的坑
背景 1.修改配置中心读取配置文件的分支,配置了spring.cloud.config.label后,报错,异常大概是读取本地配置文件异常 解决 反复尝试了之后,发现是配置仓库的配置文件格式(yml) ...
- eclipse新建maven web项目
使用eclipse版本如下,已集成了Maven,只需要配置下即可 一.下载eclipse,解压安装 二.下载maven,解压安装 三.修改${maven_home}/config/settings.x ...
- Spring+Struts2+Hibernate框架整合流程
一:基本步骤 新建Maven项目,导入相关依赖(推荐) 在WEB-INF的web.xml中进行配置 ————–Hibernate配置 —————- 创建entity包,创建数据库相关实体类 根据实体类 ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- 卷积神经网络CNN的意义
一.选用卷积的原因 局部感知 简单来说,卷积核的大小一般小于输入图像的大小(如果等于则是全连接),因此卷积提取出的特征会更多地关注局部 —— 这很符合日常我们接触到的图像处理.而每个神经元其实没有必要 ...
- OSGI基础环境搭建
1.安装jdk,步骤自行搜索 2.下载eclipse,用luna版本,下载地址: https://pan.baidu.com/s/1gdfmW5znU4fltsLCAo8tkg 提取码: nrg7 3 ...
- H5 66-清除浮动方式二
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- RabbitMQ防止消息丢失
转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(3)— 消息的交换 1.简介 RabbitMQ中,消息丢失可以简单的分为 ...
- Linux下用rm删除的文件的恢复方法
Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2008-08/14744.htm linu ...