吵吵   2015-01-25  阅读:4,866

摸了两三个月的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的理念也很好。以前听到一句话讲:“微软之所以能够这么强大,而且继续强大的原因是,它为了程序员更加方便和快捷的开发持续的努力和改进。今日看来,此言不虚。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

2条回应:“WPF ComboBox 的TextChange事件”

  1. 消灭星星说道:

    前排,学习了,感谢分享。

  2. 来看看博主!

发表评论

电子邮件地址不会被公开。 必填项已用*标注