WPF学习拾遗(三)TextBox焦点问题
这是项目里的一个问题点,组里的同学在设置Focus事件时候,遇到了死锁,最后StackOverFlow。
写一个小例子
一个Textbox控件输入值,一个TextBlock显示结果,一个检索Button
TextBox框里输入一个ID,去系统里检索一个值,把结果显示在TextBlock里。
当查询不到结果时候把焦点停留在TextBox里,当然触发的条件有TextBox失去焦点时
和按检索Button时。对于测试焦点的小例子,我们当然不用去连数据库,写个简单的方法
如果输入的值为【123】时候返回结果AAA,输入其他以外的结果表示不存在,把焦点停留在
Textbox里
很多没有同学开始写的时候都会Button_Click方法和Textbox_LostFocus方法去实现自己
的代码,Button_Click事件一点问题也没有,但是LostFocus时候却反生了异常终了,百思不得其解。
今天我们就来解决2个问题,为什么会不行?该怎么解决?
【原因】
请看一段
Private Shared Sub IsFocused_Changed(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)Dim source As UIElement = DirectCast(d, UIElement)If CBool(e.NewValue) Thensource.OnGotFocus(New RoutedEventArgs(UIElement.GotFocusEvent, source))Elsesource.OnLostFocus(New RoutedEventArgs(UIElement.LostFocusEvent, source))End IfEnd SubPublic ReadOnly Property IsFocused As BooleanGetReturn CBool(MyBase.GetValue(UIElement.IsFocusedProperty))End GetEnd PropertyFriend Shared ReadOnly IsFocusedPropertyKey As DependencyPropertyKey = DependencyProperty.RegisterReadOnly("IsFocused", GetType(Boolean), GetType(UIElement), New PropertyMetadata(BooleanBoxes.FalseBox, New PropertyChangedCallback(AddressOf UIElement.IsFocused_Changed)))Public Custom Event LostFocus As RoutedEventHandlerAddHandler(ByVal value As RoutedEventHandler)Me.AddHandler(UIElement.LostFocusEvent, value)End AddHandlerRemoveHandler(ByVal value As RoutedEventHandler)Me.RemoveHandler(UIElement.LostFocusEvent, value)End RemoveHandlerEnd Event
LostFocus事件没有前置事件,所以不能e.Handled=True去控制,所以他被设置成一个只能执行的方法,拥有一个IsFocused的依赖属性,当我们在写代码时候
前置写方法Textbox1.Focus()时候,就造成LostFoucs事件没有结束,还不能结束,进程互相等待,最后StackOverFLow
【解决方法】
1.替换事件
改用LostKeyBoardFocus事件。这个是在System.Windows.Input中完全是对于键盘事件的方法。当焦点完全离开对象时候,该事件才被触发
所以把LostFocus的处理写在LostKeyBoardFocus里就能解决上述问题
[SecurityCritical]private static void OnLostKeyboardFocusThunk(object sender, KeyboardFocusChangedEventArgs e){Invariant.Assert(!e.Handled, "Unexpected: Event has already been handled.");UIElement uiElement = sender as UIElement;if (uiElement != null){uiElement.OnLostKeyboardFocus(e);}else{ContentElement contentElement = sender as ContentElement;if (contentElement != null)contentElement.OnLostKeyboardFocus(e);else((UIElement3D) sender).OnLostKeyboardFocus(e);}}
2.使用Dispatcher.BeginInvoke用异步的方法来更新
把更新Focus这件事放入UI进程的队列中,等待前一处理结束后,进行设置
Private Sub TextBox1_LostFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles TextBox1.LostFocusIf Trim(TextBox1.Text).Equals("123") ThenTextBlock2.Text = "AAA"ElseTextBlock2.Text = String.EmptyMe.Dispatcher.BeginInvoke(DispatcherPriority.Render, New Action(Sub() TextBox1.Focus()))End IfEnd Sub
转载于:https://www.cnblogs.com/wuzhenyi/archive/2013/01/14/2859496.html
WPF学习拾遗(三)TextBox焦点问题相关推荐
- WPF学习拾遗(二)TextBlock换行
原文:WPF学习拾遗(二)TextBlock换行 下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧. 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要 ...
- WPF学习笔记(三)
1.1 事件概括 第一节中我们给窗体添加了一个按钮,不过好像Button点个几下也只有些发光样式的变化,什么你还把系统皮肤去掉了?算了承认下确实够寒碜,那让我们再动动手. 1.1.1 路由事件简述 p ...
- .NET-7.WPF学习2. 知识总结
WPF学习2. 知识总结 前言 一.面试 二.代码片段 三.查看链接 前言 对wpf 的知识总结. 一.面试 1. 跨线程操作(Dispatcher)2. template(模板类型[控件模板.数据模 ...
- WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)
时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码) 已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...
- WPF学习12:基于MVVM Light 制作图形编辑工具(3)
本文是WPF学习11:基于MVVM Light 制作图形编辑工具(2)的后续 这一次的目标是完成 两个任务. 本节完成后的效果: 本文分为三个部分: 1.对之前代码不合理的地方重新设计. 2.图形可选 ...
- WPF学习笔记-第二周【基本笔刷】
书接上回,这一次,讲的是WPF中的基本笔刷,由于是菜鸟,就不多说了,继续帖示例代码:) 第一部份 代码 第二章 基本笔刷 第一个 示例 VaryTheBackgroud P38 1 #reg ...
- 【WPF学习】第五十章 故事板
正如上一章介绍,WPF动画通过一组动画类(Animation类)表示.使用少数几个熟悉设置相关信息,如开始值.结束值以及持续时间.这显然使得它们非常适合于XAML.不是很清晰的时:如何为特定的事件和属 ...
- WPF学习笔记(数据绑定篇3)
接上回的<WPF学习笔记(数据绑定篇2)>,继续 BindValidation 此示例演示了: 如何使用错误模板: 使用样式显示错误信息: 如何在校验发生异常时执行回调: 首先,你可以看见 ...
- ComponentOne For WPF学习心得-实时数据
ComponentOne For WPF学习心得-实时数据 写在前面 不断更新的数据 数据源绑定 写在前面 这是ComponentOne For WPF学习的第三篇文章,我对比着读了前两篇文章,感觉还 ...
- 【WPF学习】第五十四章 关键帧动画
到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...
最新文章
- Linux学习(三)--vi和vim编辑器
- PDOStatement 类 FETCH_* 系列
- Apache Solr入门教程
- 从零开始学 Web 之 DOM(六)为元素绑定与解绑事件
- java插件技术_idea 好用的java插件
- Java线程同步的一些例子
- HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素
- linux oracle11g客户端安装
- Error creating bean with name ‘entityManagerFactory‘ defined in class path resource解决方案
- vue组件,通过props父组件给子组件传值,WTF, 子组件报错undefined???
- 恒生电子笔试(笔试流程,笔试介绍,题型,以往笔试题)
- PHP帮管客CRM系统源码去域名授权v2.4.4版
- linux上的c语言开发环境搭建,c语言开发环境(c语言开发环境搭建)
- 实物短缺下的现货白银操作建议
- 广度优先搜索(BFS)最短路径输出表示(三种方法)
- bmi计算 python_《Python之BMI计算》
- C语言中如何输出字符的编码,GB2312中汉字字符的编码在C语言中的输出测试
- Torch的参数初始化
- Python爬取药智网的中药材图谱网页
- 服务器硬件篇_服务器概念及分类
热门文章
- 【POJ3525】Most Distant Point from the Sea(半平面交+二分+直线平移)
- C语言数组旋转问题(C笔记)
- 十大排序算法——希尔排序(元素交换法和数组元素移动法C语言)
- beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区
- cocos2d 屏幕適配_cocos2dx 3.2 屏幕适配的理解
- Py2,Py3的差异
- 自动驾驶 8-1: 平方误差准则和最小二乘法 (上) Squared Error Criterion and the Method of Least Squares (Part 1)
- 自动驾驶 4-1 二维运动学建模Kinematic Modeling in 2D
- 容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络、存储、日志、监控管理
- Jupyter Notebook 添加说明表格Cell