介绍 向用户显示一条状态消息的时候,我不喜欢这些消息,在屏幕上出现和消失这么快你不能阅读。我认为糟糕的形式,所以我写了一个非常简单的被来自System.Windows。形式显示一个非模态的消息控制最少的时间。代码相当简单,如果你想要修饰任何更复杂的,我建议看看Nish MessageBoxManager。 实现 从System.Windows MessageForm类派生。形式类,因此您可以定制它就像任何其他形式。无限期MessageForm将显示,直到发生下列之一: 应用程序调用EndShow。表单将继续显示所需的剩余显示时间。应用程序调用CancelShow。表单将立即关闭。用户关闭表单。 表单显示的唯一的事就是一个集中标签停靠区段的形式。如果你想要什么更有趣,比如添加一个进度条,你可以改变的MessageForm Visual Studio设计师来满足您的需求。 API 属性 MessageForm类实现以下属性: MinTime 设置/获取最低形式显示时间。 MessageText 设置/获取消息文本,这基本上就是一个包装器来设置表单的标签控件的文本属性。 构造函数 有三种构造函数: 一个默认的无参数构造函数的构造函数只需要消息文本作为一个参数。表单标题将空白的,除非之前设置由应用程序调用BeginShow方法之一。一个构造函数,该函数接收消息文本和标题文本 方法 BeginShow 隐藏,复制Code
/// <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> /// <paramname="minDuration">The minimum display time, /// in milliseconds.</param> public void BeginShow(int minDisplayTime) { expires = DateTime.Now.AddMilliseconds(minDisplayTime); Show(); }
无参数方法显示了表单,使用当前的MinTime值来确定最低形式显示时间。还有第二个BeginShow方法,允许您覆盖MinTime值。 EndShow 隐藏,复制Code
/// <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 隐藏,复制Code
/// <summary> /// Immediately close the info message. /// </summary> public void CancelShow() { Close(); }
CancelShow真的只是为了一致性的API。它将立即关闭表单。 笔记 调用DoEvents 如果你叫BeginShow作为一个长期的过程的一部分,这是发生在主应用程序线程,您需要调用应用程序。DoEvents BeginShow后形成的正确显示。 使用Form.Invoke 别忘了,Windows喜欢操纵一个窗口在同一线程上创建。理想情况下,我将在主应用程序线程上创建表单并关闭它,这可能需要包装BeginShow和EndShow调用在一个形式。调用委托。 结论 这是一个非常简单的组件,但是我发现它具有很好的可重用性的和有用的应用程序我写。我通常不需要太花哨,如果我这样做了,这是特定于应用程序的,但是我仍然使用这段代码作为起点。 历史 2006年12月14日:初始版本 许可证 这篇文章没有明确的许可,但可能包含在本文使用条款文本或下载文件本身。如果有疑问,请联系作者通过下面的讨论板。许可证作者可能使用的列表可以在这里找到。 本文转载于:http://www.diyabc.com/frontweb/news4872.html