我正在尝试模拟ComboBox下拉列表的行为(或其他下拉菜单的行为,包括上下文菜单),当您点击其他任何地方时,下拉关闭,即使是无法聚焦的内容。
我已经尝试订阅MouseCaptureChanged,LostFocus和Leave等事件。我有一个自定义UserControl作为下拉列表,我只想在用户点击其他地方时关闭它。
这似乎是在许多控件中完成的事情,所以如果没有一种简单的方法,我会感到惊讶。
到目前为止,我可以提出的过于复杂的方法是使用pinvoke和SetCapture()函数,或创建MessageFilter。如果这些是唯一的选择,我不确定哪个更好。
答案 0 :(得分:1)
ComboBox由2个控件构成。
通常情况下,基地可见。当用户单击ComboBox时,Base控件将隐藏并显示DropDownList控件。此切换在后台完成,因此对于用户来说,控件似乎只是扩展了。
您要捕获的事件是通过DropDownList窗口完成的。如果单击某个位置到客户区域,DropDownList窗口将通过它的 WndProc(消息%m)方法接收 WM_KILLFOCUS 事件。然后使用 WParam = 526318 ( HIWORD(WParam))向父窗口(基本控件)发送 WM_COMMAND ( OCM_COMMAND )消息= 8 )并且Base控件知道他应该隐藏DropDownList窗口。
因此,您需要做的是实现额外的DropDown窗口并捕获WM_KILLFOCUS事件。
答案 1 :(得分:0)
您提到的控件的模板用于下拉列表将弹出窗口列为容器,并将StaysOpen属性设置为false(我认为这是默认设置)。