65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的弹出窗口控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (161投票s)

2007年2月3日

LGPL3

5分钟阅读

viewsIcon

1080927

downloadIcon

24792

如何在 C# 中创建自定义弹出窗口控件。

使用自定义弹出窗口控件的示例应用程序

Custom popup control

另一个使用自定义工具提示的应用程序...

Custom tooltip

...以及一个更复杂的、可调整大小的弹出窗口

Resizable popup

跟踪弹出窗口在控件指定部分下方打开

Tracking popup

弹出窗口的级联

Cascade of popup controls

引言

弹出窗口无处不在。每个工具提示都是一个弹出窗口;每个组合框都有其弹出列表;许多广告也以弹出窗口的形式显示。

如何在 .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.MinimumSizecontent.MaximumSize 仅在内容控件的构造函数中使用
  • popup.MinimumSizepopup.MaximumSize 在其他地方使用

ComboBox 类

System.Windows.Forms.ComboBox 类在弹出窗口控件上时行为奇怪。当用户单击组合框下拉列表超出弹出窗口的部分时,它会关闭弹出窗口。因此,我创建了一个 PopupControl.ComboBox 类,其行为正常。

PopupComboBox 类

这是一个可以附加自定义下拉列表的组合框的基类。

动画支持

动画默认启用。要更改它,请设置 AnimationDurationHidingAnimationShowingAnimation 属性。

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 属性以及 DropDownDropDownClosed 事件。
    • 修复了当内容控件的 MaximumSize 属性未设置时弹出窗口的调整大小问题。
  • 1.3.1 (20.09.2008)
    • Tab 键现在可以在弹出窗口中包含的控件之间正确地转移焦点。
    • 修复了次要 bug。
  • 1.3 (04.05.2008)
    • 添加了 AnimationDurationHidingAnimationShowingAnimation 属性。
    • 移除了 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 – 第一个版本。
© . All rights reserved.