我试图模拟ComboBox下拉列表的行为(或其他下拉菜单的行为,包括上下文菜单),当您点击其他任何地方时,下拉关闭,即使在无法聚焦的事情上也是如此.
我已经尝试订阅MouseCaptureChanged,LostFocus和Leave等事件.我有一个自定义UserControl作为下拉列表,我只想在用户点击其他任何地方时关闭它.
这似乎是在许多控件中完成的事情,所以如果没有一个简单的方法,我会感到惊讶.
到目前为止,我可以提出的过于复杂的方法是使用pinvoke和SetCapture()函数,或者创建一个MessageFilter.如果这些是唯一的选择,我不确定哪个更好.
我知道Windows Combobox
控件不过是一个Textbox
和ListBox
粘在一起的控件。
我需要在WinForms中模拟相同的东西。我试图弄清楚必须设置以获得适当效果的Windows窗口选项。
到目前为止,我管理的最好的就是创建
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
)this.TopMost = true
)this.ShowInTaskbar = false
)中未显示的表单这个无边界的最上面的表单包含我的“下拉”控件。当下拉列表失去焦点时,我会“隐藏”我的下拉列表:
this.Deactivate += new EventHandler(TheDropDownForm_Deactivate);
void TheDropDownForm_Deactivate(object sender, EventArgs e)
{
...
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
这种混乱的局面效果很好。
...除了“下拉菜单”使焦点从所有者表单移开。
这是我的问题,我的弹出窗口应具有哪些属性?
但是,当我失去下拉菜单时(如何无法失去焦点),我该如何隐藏它呢?
如何在.NET中模拟组合框下拉菜单?
注意:请勿将示例屏幕快照中看到的内容与其他内容混淆。我问如何在Winforms中创建“下拉”表单-内容可能与上面的屏幕截图不同: