如何模拟WinForms中的下拉窗口?

时间:2011-12-28 21:47:31

标签: c# winforms drop-down-menu

我知道Windows Combobox控件只不过是a Textbox and a ListBoxglued together

我需要在WinForms中模拟相同的东西。我试图找出必须设置以实现正确效果的Windows窗口选项。

  • 下拉菜单不能是child window - 否则会被剪切到父级区域
  • 从概念上讲,它必须是pop-up window - 重叠窗口
  • 它可以是owned window - 拥有的窗口始终位于z顺序的所有者之上。当系统所有者被销毁时,系统会自动销毁拥有的窗口。当拥有者最小化时,隐藏一个拥有的窗口。

到目前为止,我所管理的最好的是创造

  • 无边界(this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
  • topmost(this.TopMost = true
  • 未在任务栏中显示的表单(this.ShowInTaskbar = false

这个无边框的最顶层表单包含我的“下拉”控件。当下拉表失去焦点时,我“隐藏”我的下拉列表:

this.Deactivate += new EventHandler(TheDropDownForm_Deactivate);

void TheDropDownForm_Deactivate(object sender, EventArgs e)
{
   ...

   this.Close();
}

这种混乱的集合运作良好......

enter image description here

...除了“下拉”将焦点从所有者表格中移开。

这是我的问题,我的弹出窗口应该有哪些属性?

但是当我失去焦点时如何隐藏我的下拉表单?当它不能失去焦点时


如何在.NET中模拟组合框下拉?


注意:请勿将示例屏幕截图中显示的内容与其他内容混淆。我问如何在Winforms中创建“下拉”表单 - 内容可能与上面的截图不同:

enter image description here

1 个答案:

答案 0 :(得分:4)

使用ToolStripControlHostToolStripDropDown可以达到同样的效果。

来自this answer

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