需求:在c#的winform平台下实现类似百度搜索框并附带提示信息的功能
需求分解:
1 搜索信息作为关键字需要同步提示信息
2 点击提示信息,直接改变搜索关键字
3 当执行搜索时,关闭搜索栏
实现方案:
方案1:ComboBox
从winform平台的基础控件看,combobox是最符合题意的控件,因为combobox同时具备了搜索信息的输入,提示信息(即控制combobox中的Itmes实现),并且在一个控件内,通过控制combobox的droppedDown属性实时控制下拉提示栏,这样就实现了90%的预期功能。
但是这里有一个问题无法绕过,即当鼠标滑动到combobox的下拉items,之后再移出下拉框范围,点击,此时默认会把Items中的第一项转给comboBox的Text,相当于强制指定了Items中的一项给搜索内容,不符合搜索的需求。
尝试注册各种行为事件(MouseClick/MouseCaptureChanged/MouseDown/MouseLeave)来规避此问题,均无效。
方案2:textBox + ContextMenuStrip
即textBox控件负责键入搜索值,紧贴textBox下面画一个ContextMenuStrip输出提示信息内容。
这里基础的功能还是没问题,但是有个问题无法规避,即ContextMenuStrip属于弹出菜单,其出现时自动获得焦点,并且一旦点击区域外就失去焦点,这带来一个问题,就是原来用于输入的textBox会失焦,导致每次只能键入一个char
补救的方案是在ContextMenuStrip获取焦点的前提下,捕获其按键事件(KeyPress/KeyUp/KeyDown),并将其更新给textBox,这样就能实现继续输