【问题标题】:How to simulate a drop-down window in WinForms?如何在 WinForms 中模拟下拉窗口?
【发布时间】:2012-01-29 12:08:45
【问题描述】:

我知道 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)
  • 最上面 (this.TopMost = true)
  • 任务栏中未显示的表单 (this.ShowInTaskbar = false)

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

this.Deactivate += new EventHandler(TheDropDownForm_Deactivate);

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

   this.Close();
}

这堆乱七八糟的东西效果很好......

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

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

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


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


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

【问题讨论】:

  • 我很好奇您在哪里/如何/为什么需要这样的东西?您可能需要考虑使用 WPF 控件(更容易操作,并且可以与 WinForms 一起使用)。
  • @HansPassant 从根本上说,这个答案不能为我服务,因为控件是“父母”。如果是父级,那么它将剪辑到它的父级(即“下拉菜单”可以存在于其“父级”表单之外)
  • 你可以在这里找到另一个解决方案:stackoverflow.com/a/15305176/1522062

标签: c# winforms drop-down-menu


【解决方案1】:

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

【讨论】:

  • 看起来很合理,除了toolDrop.Show throws 顶级控件不能添加到控件中。。大概是因为我想显示Form
  • @IanBoyd 是的,但接下来就让TopLevel = false;
  • TopLevel 相得益彰,我不知道它的存在(或者它与TopMost 有何不同)。奖励:它甚至有“弹出阴影”。剩下的唯一一件事是我怎么知道“弹出窗口”何时关闭? DeactivateFormClosed 事件都不会触发。
  • @IanBoyd 查看 ToolStripDropDown 事件。您将拥有OpenedOpeningClosedClosing 事件,您可以连接起来。
  • 谢谢,Lars - 我认为这里有足够的信息来解决下拉答案。这需要做一些工作,这样我才能将杂乱无章的大杂烩弄得一团糟,这样就可以为另一个通用的“弹出”问题提供足够通用的答案。现在所有代码都交织在一起。
猜你喜欢
  • 2012-01-29
  • 2018-06-09
  • 2011-02-02
  • 1970-01-01
  • 2015-06-15
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多