摸了两三个月的WPF,才刚刚入门。
碰到一个需求,就是做联想输入框,使用的是combobox控件,我希望,当输入一个文字的时候,就去数据库中查找相关的内容,然后下拉框就弹出来相关的内容。
拖过来一个ComboBox,结果一看,只有个TextInput事件,试了一下,发现压根就无效。
难道就真的木有办法了么?
当然是有办法的。首先我们需要了解一下combobox控件的模板,如果不明白里面的模板到底是怎么样的,我们可以打开微软的Blend这个界面设计工具来看看,看看代码可以发现一个combobox是由一下几层组成的:
1、Border 这个是外边框,可以实现圆角矩形
2、ToggleButton,这个就是我们点击的下拉框了,这个与Border的层级是平衡的,也就是说这个按钮其实是占据了所有的控件大小的。
2.1、Border,这个border构成了右侧下拉框按钮的边框,然后里面是一个Path即画的三角型。
3、DockPanel,这个也是个布局控件,左侧是文本的内容,即选择的内容ContentPresenter,右侧是一个FrameworkElement,这个是干什么用的呢?前文我们知道togglebutton是覆盖整个控件的,现在又被显示的文本覆盖了,右侧的下拉框就显示不了了,因此该处的FrameworkElement就是为那个下拉按钮占位的。
4、Popup,不言而喻,弹出框。
一开始我们看Combobox其实蛮长的,但是内容有很大部分重复,仔细一看就知道,原来是因为IsEditable为true的时候,模板就需要改变,变什么呢?就是原来的内容呈现的ContentPresenter要变成一个编辑框,即TextBox。
好了,说到此处我们就有办法了,:
1、在定义模板的时候,定义里面的TextBox的名字为x:Name=”PART_EditableTextBox”。
2、在combobox的模板中找到TextBox,然后通过委托来响应它的TextChange事件:
ControlTemplate cbbTemplate = (ControlTemplate)cbbName.Template; TextBox editBox = (TextBox)cbbTemplate.FindName("PART_EditableTextBox", cbbName); editBox.TextChanged += delegate { this.ComboBoxEditTextChange(this,null); };
3、然后在ComboBoxEditTextChange事件里面,你就可以do you self的这些事情了。
后记:WPF用的越多,就越觉得微软的这个框架是做的很好的,延展性非常的不错,数据驱动UI的理念也很好。以前听到一句话讲:“微软之所以能够这么强大,而且继续强大的原因是,它为了程序员更加方便和快捷的开发持续的努力和改进。今日看来,此言不虚。
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/3197
吵吵微信朋友圈,请付款实名加入:
前排,学习了,感谢分享。
来看看博主!