如何模拟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中创建“下拉”表单 – 内容可能与上面的截图不同:

在此处输入图像描述

使用ToolStripControlHostToolStripDropDown可以实现相同的效果。

从这个答案 :

 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