简单的弹出窗口控件






4.93/5 (161投票s)
如何在 C# 中创建自定义弹出窗口控件。
引言
弹出窗口无处不在。每个工具提示都是一个弹出窗口;每个组合框都有其弹出列表;许多广告也以弹出窗口的形式显示。
如何在 .NET 中创建弹出窗口控件?
起初,我们可能会选择 Form
类作为弹出窗口控件的基类。不幸的是,这是一个糟糕的选择,因为当我们显示弹出窗口窗体时,父窗体会失去焦点。弹出窗口不应该导致这种情况。幸运的是,有一个类不会导致焦点丢失。我们可以将其用作弹出窗口控件的基类。它就是 ToolStripDropDown
类。
如何使用 ToolStripDropDown 类?
这是最简单的方法,无需从此类派生
ToolStripDropDown popup = new ToolStripDropDown();
popup.Margin = Padding.Empty;
popup.Padding = Padding.Empty;
ToolStripControlHost host = new ToolStripControlHost(content);
host.Margin = Padding.Empty;
host.Padding = Padding.Empty;
popup.Items.Add(host);
popup.Show(parentForm, location);
在这种情况下,content
是我们想在弹出窗口中显示的控件。当然,我们必须记住稍后释放弹出窗口及其内容。
Popup 类
我编写了一个 Popup
类,它派生自 ToolStripDropDown
并简化了弹出窗口的创建和管理。该类会自动计算它应该“弹出”在屏幕上的位置。它还在内容控件被释放后立即释放自身。例如,要显示一个带有按钮的弹出窗口,我们可以这样写
new Popup(new Button()).Show(someControl);
在这里,someControl
将是我们要在此控件下方显示弹出窗口的控件。
弹出窗口调整大小
要为您的弹出窗口启用调整大小,您必须将 Resizable
属性设置为 true
,并将以下代码添加到您的内容控件类中
protected override void WndProc(ref Message m)
{
if ((Parent as Popup).ProcessResizing(ref m)) return;
base.WndProc(ref m);
}
您还必须将内容控件的 ResizeRedraw
属性设置为 true
。
重要!
要指定内容控件的最小和最大尺寸,请使用以下属性
content.MinimumSize
和content.MaximumSize
仅在内容控件的构造函数中使用popup.MinimumSize
和popup.MaximumSize
在其他地方使用
ComboBox 类
System.Windows.Forms.ComboBox
类在弹出窗口控件上时行为奇怪。当用户单击组合框下拉列表超出弹出窗口的部分时,它会关闭弹出窗口。因此,我创建了一个 PopupControl.ComboBox
类,其行为正常。
PopupComboBox 类
这是一个可以附加自定义下拉列表的组合框的基类。
动画支持
动画默认启用。要更改它,请设置 AnimationDuration
、HidingAnimation
和 ShowingAnimation
属性。
Popup 成员
属性
AcceptAlt
— 获取或设置一个值,指示按 Alt 键是否会关闭弹出窗口。AnimationDuration
— 确定动画的持续时间。Content
— 获取弹出窗口的内容。FocusOnOpen
— 获取或设置一个值,指示弹出窗口打开后内容是否应获得焦点。HidingAnimation
— 确定隐藏弹出窗口时使用的动画。MaximumSize
— 获取或设置弹出窗口的最大尺寸。MinimumSize
— 获取或设置弹出窗口的最小尺寸。NonInteractive
— 获取或设置一个值,指示弹出窗口是否像透明窗口一样;例如,它无法被点击(注意 - 它不影响子控件)。Resizable
— 获取或设置一个值,指示弹出窗口是否可调整大小。ShowingAnimation
— 确定显示弹出窗口时使用的动画。
构造函数
Popup(Control content)
— 初始化Popup
类的新实例。
方法
void PaintSizeGrip(PaintEventArgs e)
— 绘制调整大小手柄。bool ProcessResizing(ref Message m)
— 处理调整大小消息。void Show(Control control)
— 在指定控件下方显示弹出窗口。void Show(Control control, Rectangle area)
— 在指定控件的指定区域下方显示弹出窗口。
待办事项
- 自定义工具提示的基类。
- 类似 Office 2007 的工具提示类。
历史
- 1.5 (2010/10/20) — 重要! 这是该控件的最后一个“独立”版本。下一版本包含在一个托管在 CodePlex 上的新项目中。
- 向
Popup
类添加了NonInteractive
属性。 - 修复了在 DualView/多显示器系统上的调整大小问题。
- 弹出窗口现在始终显示在其他窗口之上(以前弹出窗口在动画过程中可能会显示在其父窗口下方)。
PopupComboBox
在 Windows 7 上未能正确将焦点设置到其下拉列表。- 提高了与 Mono 的兼容性。
- 使用 C# 3.0 语法(自动属性、lambda)。
- 提供了 .NET 2.0 和 .NET 4.0 的签名二进制文件。
- 解决方案已升级到 Visual C# 2010 格式。
- 许可证更改为 LGPL 3.0。
- 向
- 1.4 (16.01.2009)
- 向
PopupComboBox
类添加了DroppedDown
属性以及DropDown
、DropDownClosed
事件。 - 修复了当内容控件的
MaximumSize
属性未设置时弹出窗口的调整大小问题。
- 向
- 1.3.1 (20.09.2008)
- Tab 键现在可以在弹出窗口中包含的控件之间正确地转移焦点。
- 修复了次要 bug。
- 1.3 (04.05.2008)
- 添加了
AnimationDuration
、HidingAnimation
和ShowingAnimation
属性。 - 移除了
UseFadeEffect
属性。 - 弹出窗口控件现在即使在
FocusOnOpen
属性设置为false
时也可以进行动画。
- 添加了
- 1.2.5 (24.01.2008)
- 修复了“Alt+F4” bug。
- 修复了调整大小手柄的绘制。
- 修复了次要 bug。
- 1.2 (24.07.2007)
- 添加了动画支持。
- 添加了
AcceptAlt
属性。 - 修复了单击非客户端区域的 bug。
- 修复了次要 bug。
- 1.1 (05.07.2007)
- 添加了 XML 文档。
- 修复了
ComboBox
类,使其可以在弹出窗口中使用。 - 添加了可以具有自定义下拉列表的组合框的基类
PopupComboBox
。 - 如果弹出窗口可调整大小,则会自动绘制调整大小手柄。
- 添加了对可调整大小弹出窗口的最小和最大尺寸的支持。
- 修复了次要 bug。
- 1.0
- 2007/06/08 – 添加了调整大小支持和级联弹出窗口的使用能力。
- 2007/02/06 – 添加了键盘和自定义区域支持,并且
ShowForControl
方法名更改为Show
。 - 2007/02/03 – 第一个版本。