问题描述
我现在要做的功能是:在一个Textbox中输入完点击其他地方立刻根据这个Textbox查询信息。WPF界面:<TextBoxx:Name="txtCardNum"LostFocus="txtCardNo_LostFocus"/>(这里是一个身份证的Textbox)<Buttonx:Name="btnCancel"Click="btnCancel_Click">取消</Button>c#后台:privatevoidtxtCardNo_LostFocus(objectsender,RoutedEventArgse){焦点一失去,点到其他Textbox或者其他控件的时候,就把TxtCardNum的值传给服务器,服务器如果查找到了就返回数据,没查到就返回错误。cardNo=txtCardNo.Text.Trim();varresponse=GetPatientInfoByCardNo(cardNo,App.User.HospitalID);if(response.Data!=null&&response.Exception.ErrorCode==5205){bind_page(response.Data);PatientModel=response.Data;}else{提示错误}}privatevoidbtnCancel_Click(objectsender,RoutedEventArgse){this.Close();}运行的时候我发现点了这个Textbox但什么也没改的时候直接点击取消按钮,它会先优先响应txtCardNo_LostFocus事件。怎么才能让点击取消的时候窗口就直接关闭了。
解决方案
解决方案二:
既然用了lostfocus事件那估计也就只能这样了你无法知道焦点离开的时候你是要点击确定还是取消而且按照顺序来说lostfocus事件肯定是优先执行的没有lostfocus又哪里来的其他控件gotfocus?。而且你这样我也觉得没有什么不妥的就算是离开焦点提示一个没有查询到数据管他点的是确定还是取消都无所谓只是提示你的做的好看一个别是弹框的那种提示就是了
解决方案三:
你给“取消”按钮注册PreviewGotKeyboardFocus事件,在事件的相应函数里面设置e.Handled=true;privatevoidCancelBT_PreviewGotKeyboardFocus(objectsender,KeyboardFocusChangedEventArgse){e.Handled=true;}
解决方案四:
你是业务逻辑错误,不要把它推给编程。要有能力先“分出层次来”,这样才能提高自己的程序设计水平,你才能跟那些浑浑噩噩的编程者显出“差别”。1.如果你在业务逻辑上没有设计过LostFocus相关的流程,为什么要写代码呢?代码可以删除了!2.反之,如果代码是有文档的、有业务逻辑的,那么现在出了问题,一定要回到业务逻辑上去考虑,而不要扯到什么编程伎俩上。例如,如果你业务逻辑能说到“如果用户有修改,则.......”这是LostFocus处理的逻辑,而你发现LostFocus代码是不管用户有没有修改都执行什么cardNo=txtCardNo.Text.Trim()的语句,这是代码跟逻辑设计不符,这样的代码就是废物代码,如果带着bug再来些更多的废物代码暂时掩盖它,就会产生恶性循环。只有你能抛开它而看到更高层次、更本质的编程原因,才能真正解决问题。而用技术来理解问题,这本身是邪的。不要太技术化,要学会站在逻辑的角度来设计软件流程,而先把编程伎俩忘掉。
解决方案五:
延迟执行,比如在你的lostfocus加个thread.Sleep(100),然后判断个全局变量,确认是否要继续执行而你按钮点击事件时,将全局变量改值
解决方案六:
比如说你遇到一个人告诉你“我是人,如果我说谎了那么我就不是人”,你认为他说话有没有自相矛盾呢?但是你自己就在随时随地扯这种毛病,还用来编程。这就需要一边学习编程一边学习整理自己的逻辑,甚至重点是后者,而编程技能其实根本不重要。