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






4.97/5 (10投票s)
2006年12月14日
3分钟阅读

55213

507
显示有用的消息,
引言
当向用户显示状态消息时,我不喜欢那些在屏幕上出现并消失得太快以至于无法阅读的消息。我认为这很糟糕,所以我编写了一个非常简单的类,该类派生自 System.Windows.Form
,用于以受控的最小时间量显示非模态消息。代码非常简单,如果您想用更复杂的东西来修饰它,我建议您看看 Nish 的 MessageBoxManager。
实现
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
委托中包装 BeginShow
和 EndShow
调用。
结论
这是一个非常简单的组件,但我发现它在我编写的应用程序中非常可重用和有用。 我通常不需要太花哨的东西,如果需要的话,它对于应用程序来说太具体了,但我仍然使用这段代码作为起点。
历史
- 2006 年 12 月 14 日:初始版本
许可证
本文没有附加明确的许可,但可能包含文章文本或下载文件中的使用条款。 如有疑问,请通过下面的讨论区联系作者。 可以在此处找到作者可能使用的许可证列表。