如何模拟WinForms中的下拉窗口?
我知道Windows Combobox
控件只是一个Textbox
和一个ListBox
粘在一起 。
我需要在WinForms中模拟相同的东西。 我试图找出必须设置以实现正确效果的Windows窗口选项。
- 下拉列表不能是子窗口 – 否则会被剪切到父窗口区域
- 从概念上讲,它必须是一个弹出窗口 – 一个重叠的窗口
- 它可以是一个拥有的窗口 – 拥有的窗口始终位于z顺序的所有者之上。 当系统所有者被销毁时,系统会自动销毁拥有的窗口。 拥有的窗口在其所有者最小化时隐藏。
到目前为止,我所管理的最好的是创造
- 无边框(
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(); }
这个混乱的集合运作得很好……
…除了“下拉”将焦点从所有者表格中移开。
这是我的问题,我的弹出窗口应该有哪些属性?
- SW_SHOWNOACTIVATE ?
但是,当它失去焦点时,如何隐藏我的下拉forms – 当它不能失去焦点时 ?
我如何模拟.NET中的combobox下拉?
注意:请勿将示例屏幕截图中显示的内容与其他内容混淆。 我问如何在Winforms中创建“下拉”表单 – 内容可能与上面的截图不同:
使用ToolStripControlHost
和ToolStripDropDown
可以实现相同的效果。
从这个答案 :
Private Sub ShowControl(ByVal fromControl As Control, ByVal whichControl As Control) '\\ whichControl needs MinimumSize set:' whichControl.MinimumSize = whichControl.Size Dim toolDrop As New ToolStripDropDown() Dim toolHost As New ToolStripControlHost(whichControl) toolHost.Margin = New Padding(0) toolDrop.Padding = New Padding(0) toolDrop.Items.Add(toolHost) toolDrop.Show(Me, New Point(fromControl.Left, fromControl.Bottom)) End Sub