WPF Dev ComboBoxEdit下拉选框
1、最近学习了一段时间WPF开发,需要做一个用于登录模块的账号下拉输入选框,参考一些大牛的设计例子,使用ComboBox实现了下拉输入选框,通过txtUserCode_TextChanged可以账号和密码自动完成,另外对ComboBox的ComboBoxItem的样式替换增加了删除操作,功能基本过关。
2、但是!ComboBox没有NullText,此外其他控件用的都是DevExpress,两者选中时的外边框高亮挠亚桃垓颜色有差异。想到有两种改法,一是给ComboBox加上NullText和修改ComboBox取得焦点样式,另一个是使用Dev的ComboBoxEdit代替ComboBox。我选了第二种改法。之后就是一整天的坑,终于把ComboBoxEdit代替ComboBox。首先ComboBoxEdit无法输入,很快就在属性中找到ValidateOnTextInput,改为False搞定;然后输入回车却换行,找到是AcceptsReturn和AcceptsTab在作怪,都改False;再接着编辑时好端端的鼠标一走数据马上消失了,这真是一个难缠的问题。最后柳暗花明又一村,原来设置了DisplayMember和ValueMember,去除后Ok。搞定这关键问题,感觉胜利曙光就在眼前,一鼓作气把ComboBoxEdit的样式弄出来,翻到下拉原来用的是ListBoxItem,怪不得使用ComboBoxItem不兼容,但两者异曲同工,终于乘胜追击把下拉选项中的删除功能移植过来了。好像胜利在握啦,一不留神又掉进坑里了。自动完成和密码自动同步功能在ComboBoxEdit的TextBoxBase.TextChanged还藏了个大Bug。通过TextChanged获取DisplayText/Text/EditValue,总是不能实时取到当前编辑的值(ComboBox情景时是Ok的)。DisplayText和自动完成之间不好协调啊,还考虑复制粘贴删除回退等等。折腾好一阵,终于找到(e.OriginalSource as TextBox).Text取到了实时的编辑值。
3、最后,以为是完结了。没想到还有一个回马枪。ComboBoxEdit在自动完成后,如果点击Backapace,ComboBoxE颊俄岿髭dit的中的值会回退一格,但是自动完成还在起作用。ComboBox中的Backapace实现的是Delete的操作。于是打算抓到Backapace触发然后用Delete移花接木一下。这也是一个坑,在PreviewKeyDown竟然捕获不到Backapace,在TextChanged中又判断不了是Backapace触发。估计是ComboBoxEdit自己截获了Backapace,因为ComboBoxEdit有一个ClearSelectionOnBackspace属性,可设置退格时清空选框,但是我不是要清空,我想的是退格时不自动完成,同时输入值退一格。现实是退是退了一格,但是自动完成又补充去了。采用InputBindings.KeyBinding和CommandBindings都试了一遍,后台绑定Back按键,但是还是读取不到Backapace触发。最后还是解决了,把键盘钩子放在主窗口中,而不是ComboBoxEdit中,终于抓到退格操作。
4、赶紧撤了,不看代码应该不会想起哪里还有坑吧。END。