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

消息窗体 - 最短显示时间窗体

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (10投票s)

2006年12月14日

3分钟阅读

viewsIcon

55213

downloadIcon

507

显示有用的消息, 最短持续时间。

引言

当向用户显示状态消息时,我不喜欢那些在屏幕上出现并消失得太快以至于无法阅读的消息。我认为这很糟糕,所以我编写了一个非常简单的类,该类派生自 System.Windows.Form,用于以受控的最小时间量显示非模态消息。代码非常简单,如果您想用更复杂的东西来修饰它,我建议您看看 NishMessageBoxManager

实现

MessageForm 类派生自 System.Windows.Form 类,因此您可以像自定义任何其他窗体一样自定义它。 MessageForm 将无限期地显示,直到发生以下情况之一

  • 应用程序调用 EndShow。 窗体将继续显示剩余的所需显示时间。
  • 应用程序调用 CancelShow。 窗体将立即关闭。
  • 用户关闭窗体。

窗体显示的唯一内容是中心对齐的 Label,它停靠到窗体的范围。 如果您想要更有趣的内容,例如添加进度条,您可以在 Visual Studio 设计器中更改 MessageForm 以满足您的需求。

API

属性

MessageForm 类实现以下属性

MinTime

设置/获取窗体的最小显示时间。

MessageText

设置/获取消息文本,这基本上只是一个设置窗体的 Label 控件的 Text 属性的包装器。

构造函数

有三个构造函数

  • 一个默认的无参数构造函数
  • 一个仅将消息文本作为参数的构造函数。除非应用程序在调用 BeginShow 方法之一之前设置了窗体标题,否则窗体标题将为空。
  • 一个接受消息文本和标题文本的构造函数

方法

BeginShow

/// <summary>
/// Show the form with the current minimum display time.
/// </summary>
public void BeginShow()
{
  expires = DateTime.Now.AddMilliseconds(minTime);
  Show();
}

/// <summary>
/// Show the form for a minimum time.
/// </summary>
/// <param name="minDuration">The minimum display time, 
/// in milliseconds.</param>
public void BeginShow(int minDisplayTime)
{
  expires = DateTime.Now.AddMilliseconds(minDisplayTime);
  Show();
}

无参数方法显示窗体,并使用当前的 MinTime 值来确定窗体的最小显示时间。还有第二个 BeginShow 方法,允许您覆盖 MinTime 值。

EndShow

/// <summary>
/// Wait until the minimum display time has expired (which it may have) then
/// close the info message dialog. This is a thread blocking call.
/// </summary>
public void EndShow()
{
  TimeSpan remTime = expires - DateTime.Now;
  int remms = (int)remTime.TotalMilliseconds;

  if (remms > 0)
  {
    Thread.Sleep(remms);
  }

  Close();
}

在最小显示时间到期之前,此方法不会关闭窗体。需要注意的一个重要事项是,这是一个阻塞调用,因此您的线程(例如主应用程序线程)将被挂起,直到最小显示时间到期。这可能不是理想的情况,但这是一个复杂的问题(不是从实现的角度来看,而是从可用性和用户反馈的角度来看),最好留给特定的应用程序需求。

CancelShow

/// <summary>
/// Immediately close the info message.
/// </summary>
public void CancelShow()
{
  Close();
}

CancelShow 实际上只是为了 API 的一致性。它会立即关闭窗体。

注释

调用 DoEvents

如果您在主应用程序线程上发生的长时间流程中调用 BeginShow,您需要在 BeginShow 之后立即调用 Application.DoEvents 以使窗体正确显示。

使用 Form.Invoke

不要忘记,Windows 喜欢在创建窗口的同一线程上操作窗口。 理想情况下,我会在主应用程序线程上创建窗体并在那里关闭它,这也可能需要在 Form.Invoke 委托中包装 BeginShowEndShow 调用。

结论

这是一个非常简单的组件,但我发现它在我编写的应用程序中非常可重用和有用。 我通常不需要太花哨的东西,如果需要的话,它对于应用程序来说太具体了,但我仍然使用这段代码作为起点。

历史

  • 2006 年 12 月 14 日:初始版本

许可证

本文没有附加明确的许可,但可能包含文章文本或下载文件中的使用条款。 如有疑问,请通过下面的讨论区联系作者。 可以在此处找到作者可能使用的许可证列表。

© . All rights reserved.