这是项目里的一个问题点,组里的同学在设置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焦点问题相关推荐

  1. WPF学习拾遗(二)TextBlock换行

    原文:WPF学习拾遗(二)TextBlock换行 下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧. 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要 ...

  2. WPF学习笔记(三)

    1.1 事件概括 第一节中我们给窗体添加了一个按钮,不过好像Button点个几下也只有些发光样式的变化,什么你还把系统皮肤去掉了?算了承认下确实够寒碜,那让我们再动动手. 1.1.1 路由事件简述 p ...

  3. .NET-7.WPF学习2. 知识总结

    WPF学习2. 知识总结 前言 一.面试 二.代码片段 三.查看链接 前言 对wpf 的知识总结. 一.面试 1. 跨线程操作(Dispatcher)2. template(模板类型[控件模板.数据模 ...

  4. WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)

    时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码)  已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...

  5. WPF学习12:基于MVVM Light 制作图形编辑工具(3)

    本文是WPF学习11:基于MVVM Light 制作图形编辑工具(2)的后续 这一次的目标是完成 两个任务. 本节完成后的效果: 本文分为三个部分: 1.对之前代码不合理的地方重新设计. 2.图形可选 ...

  6. WPF学习笔记-第二周【基本笔刷】

    书接上回,这一次,讲的是WPF中的基本笔刷,由于是菜鸟,就不多说了,继续帖示例代码:) 第一部份 代码 第二章 基本笔刷 第一个 示例 VaryTheBackgroud P38  1     #reg ...

  7. 【WPF学习】第五十章 故事板

    正如上一章介绍,WPF动画通过一组动画类(Animation类)表示.使用少数几个熟悉设置相关信息,如开始值.结束值以及持续时间.这显然使得它们非常适合于XAML.不是很清晰的时:如何为特定的事件和属 ...

  8. WPF学习笔记(数据绑定篇3)

    接上回的<WPF学习笔记(数据绑定篇2)>,继续 BindValidation 此示例演示了: 如何使用错误模板: 使用样式显示错误信息: 如何在校验发生异常时执行回调: 首先,你可以看见 ...

  9. ComponentOne For WPF学习心得-实时数据

    ComponentOne For WPF学习心得-实时数据 写在前面 不断更新的数据 数据源绑定 写在前面 这是ComponentOne For WPF学习的第三篇文章,我对比着读了前两篇文章,感觉还 ...

  10. 【WPF学习】第五十四章 关键帧动画

    到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...

最新文章

  1. Linux学习(三)--vi和vim编辑器
  2. PDOStatement 类 FETCH_* 系列
  3. Apache Solr入门教程
  4. 从零开始学 Web 之 DOM(六)为元素绑定与解绑事件
  5. java插件技术_idea 好用的java插件
  6. Java线程同步的一些例子
  7. HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素
  8. linux oracle11g客户端安装
  9. Error creating bean with name ‘entityManagerFactory‘ defined in class path resource解决方案
  10. vue组件,通过props父组件给子组件传值,WTF, 子组件报错undefined???
  11. 恒生电子笔试(笔试流程,笔试介绍,题型,以往笔试题)
  12. PHP帮管客CRM系统源码去域名授权v2.4.4版
  13. linux上的c语言开发环境搭建,c语言开发环境(c语言开发环境搭建)
  14. 实物短缺下的现货白银操作建议
  15. 广度优先搜索(BFS)最短路径输出表示(三种方法)
  16. bmi计算 python_《Python之BMI计算》
  17. C语言中如何输出字符的编码,GB2312中汉字字符的编码在C语言中的输出测试
  18. Torch的参数初始化
  19. Python爬取药智网的中药材图谱网页
  20. 服务器硬件篇_服务器概念及分类

热门文章

  1. 【POJ3525】Most Distant Point from the Sea(半平面交+二分+直线平移)
  2. C语言数组旋转问题(C笔记)
  3. 十大排序算法——希尔排序(元素交换法和数组元素移动法C语言)
  4. beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区
  5. cocos2d 屏幕適配_cocos2dx 3.2 屏幕适配的理解
  6. Py2,Py3的差异
  7. 自动驾驶 8-1: 平方误差准则和最小二乘法 (上) Squared Error Criterion and the Method of Least Squares (Part 1)
  8. 自动驾驶 4-1 二维运动学建模Kinematic Modeling in 2D
  9. 容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络、存储、日志、监控管理
  10. Jupyter Notebook 添加说明表格Cell