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

6
我知道Windows的Combobox控件实际上就是一个文本框和列表框粘在一起形成的
我需要在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();
}

这个混合体的东西还算顺畅...

enter image description here

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

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

但是,当下拉表单失去焦点时,我如何隐藏它-当它无法失去焦点时


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


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

enter image description here


可能是重复的问题:如何创建一个悬浮的C# Winforms控件 - Hans Passant
我很好奇你在哪里/如何/为什么需要这样的东西?您可能希望考虑使用WPF控件(更容易操作,并且可以与WinForms一起使用)。 - tsells
@HansPassant 从根本上讲,这个答案无法满足我的需求,因为控件是“父子关系”的。如果是父子关系,则它将被剪裁到其父对象(即“下拉列表框”可以存在于其“父”窗体之外)。 - Ian Boyd
你可以在这里找到另一个解决方案:stackoverflow.com/a/15305176/1522062 - Zoltan Tirinda
1个回答

4

使用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

看起来很合理,除了 toolDrop.Show 报错 无法将顶级控件添加到控件中。这可能是因为我试图显示一个 Form 导致的。 - Ian Boyd
@IanBoyd 是的,但是只需要将 TopLevel = false; 设为假即可。 - LarsTech
对于 TopLevel,我感到非常惊喜,因为我之前并不知道它的存在(或者它与 TopMost 的区别)。额外的好处是,它甚至还有“弹出阴影”。唯一剩下的问题是如何知道“弹出”何时关闭?既不是 Deactivate 事件也不是 FormClosed 事件触发。 - Ian Boyd
@IanBoyd 看一下 ToolStripDropDown 事件。你可以连接 OpenedOpeningClosedClosing 事件。 - LarsTech
谢谢,Lars - 我认为这里有足够的信息来解决下拉答案的问题。这需要一些工作,以便我可以将混乱的杂乱无章的代码整理到足够通用的答案,以回答其他通用的“弹出”问题。现在所有的代码都交织在一起。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接