如何将控件放在 Windows 表单中的临时层
How to put control in temporary layer in Windows Forms
我创建了自己的用户控件。当我单击表单上的某个按钮时,我想显示我的用户控件。但是 我不希望它永久显示 像这样:
uc.Visible = true;
然后再次隐藏:
uc.Visible = false;
我希望我的用户控件的行为类似于上下文菜单。当我右键单击某个内容时,会显示我的上下文菜单,然后 我不关心如何隐藏我的上下文菜单。自动隐藏:
- 当我点击某个按钮时,
- 当我移动 window、
- 当我的 window 失去焦点时
- 等
如何为我的用户控件实现此行为?
它有点难看,但我从 ToolStripDropDown
继承了一些成功,然后通过 ToolStripControlHost
包含任意内容。将您的内容(UserControl、Panel 或其他一些容器)传递给 ToolStripControlHost
的构造函数并将其添加到 ToolStripDropDown.Items
.
丑陋的两部分是:
- 它可能无法很好地自动调整自身大小,因此请准备好自己处理大小调整。最简单的方法是将
ToolStripDropDown
的 MinimumSize
和 MaximumSize
设置为内容的大小。此外,用户也没有内置的方法来调整 window 的大小,因此如果需要,您也必须实现它。
- 某些控件在
ToolStripDropDown
中表现不佳。一旦他们把焦点放在你在别处点击的整个东西上,它就会消失。例如 ComboBox
和 DateTimePicker
。您可以通过在 内部 class System.Windows.Forms.ToolStripManager+ModalMenuFilter
上调用 SuspendMenuMode
和 ResumeMenuMode
来解决这个问题。您将需要找到此类型并使用反射调用这两个方法。
以下资源可能会有额外帮助:
我创建了自己的用户控件。当我单击表单上的某个按钮时,我想显示我的用户控件。但是 我不希望它永久显示 像这样:
uc.Visible = true;
然后再次隐藏:
uc.Visible = false;
我希望我的用户控件的行为类似于上下文菜单。当我右键单击某个内容时,会显示我的上下文菜单,然后 我不关心如何隐藏我的上下文菜单。自动隐藏:
- 当我点击某个按钮时,
- 当我移动 window、
- 当我的 window 失去焦点时
- 等
如何为我的用户控件实现此行为?
它有点难看,但我从 ToolStripDropDown
继承了一些成功,然后通过 ToolStripControlHost
包含任意内容。将您的内容(UserControl、Panel 或其他一些容器)传递给 ToolStripControlHost
的构造函数并将其添加到 ToolStripDropDown.Items
.
丑陋的两部分是:
- 它可能无法很好地自动调整自身大小,因此请准备好自己处理大小调整。最简单的方法是将
ToolStripDropDown
的MinimumSize
和MaximumSize
设置为内容的大小。此外,用户也没有内置的方法来调整 window 的大小,因此如果需要,您也必须实现它。 - 某些控件在
ToolStripDropDown
中表现不佳。一旦他们把焦点放在你在别处点击的整个东西上,它就会消失。例如ComboBox
和DateTimePicker
。您可以通过在 内部 classSystem.Windows.Forms.ToolStripManager+ModalMenuFilter
上调用SuspendMenuMode
和ResumeMenuMode
来解决这个问题。您将需要找到此类型并使用反射调用这两个方法。
以下资源可能会有额外帮助: