我有一个winform软件,可以通过协议与硬件进行通信。
有时会发生通信错误,我想通知用户。错误可能是例如:超时,crc错误,物理断开等......
我有一个通讯窗口,我在其中显示这些错误,但默认情况下这是隐藏的。用户可以通过菜单栏打开它。
弹出窗口对用户(以及我自己)很烦,所以我想要一种非侵入性的方式来通知用户发生了错误。也许像XP告诉你更新的信息泡泡已准备好用于您的计算机?我知道NotifyIcon可以帮助将东西放入系统托盘中,这是我不希望的。我宁愿将它保留在我的MDI中。
我也接受其他创意。
答案 0 :(得分:2)
当发生错误时,可以使用几种替代方案,每种方法都有各自的优缺点:
MessageBox弹出窗口
向用户显示一个消息框弹出窗口
优势:因为它是模态的,用户必须确认错误才能继续
缺点:因为它是模态的,它会中断用户所做的任何事情。多个错误也很不方便,需要多次确认。
显示通讯窗口
如果隐藏了现有的通信窗口,则显示它以使记录的错误可见
优势:使用现有熟悉的沟通机制
缺点:如果用户并不真正关心错误,那么通信窗口会不断重新出现可能会很烦人。
状态栏消息
在应用程序的状态栏中显示消息
优势:将始终在屏幕上显示,但与主窗口“不在一起”。
缺点:很难显示多条消息,可能会被用户遗漏。
气球通知
在通知图标旁边显示Outlook / MSN Messenger样式通知消息
优势:非常明显,用户可以注意到,但不一定需要通知图标。也可以将多条消息整理成一个弹出窗口
缺点:可能会让用户烦恼。
通知图标 显示通知图标(可能带有气球通知) 优势:对用户来说是显而易见的,但仍然不引人注目 缺点:是另一个混乱用户桌面的通知图标。
就个人而言,我会选择选项2,因为它需要最少的努力才能实现。如果一旦人们开始遇到它是不可接受的,那么请查看其他选择。
答案 1 :(得分:1)
一个(相对)常见的范例是在状态栏上放置一条消息(“[x] New Messages”),并使消息窗口的外观成为用户操作。
答案 2 :(得分:1)
如果您的MDI窗口是打开/可见的,那么您可以在其上有一个通信状态图标 - 当一切正常时,这将是绿色,警告时会显示橙色(如检测到损坏的数据包,但通信仍在工作,并且系统已恢复),红色表示错误(如5秒内没有可解码的通信)。当事情发生时,这可以让它变得相当微妙,但是出现问题时显然会出现“不同”。
对于严重错误(例如断开连接),您可能希望获得更多“侵入性”,因为有一点不会让问题引起用户的注意,而不是用错误报告打扰它们。
如果您的窗口不可见,那么(尽管您不喜欢这个想法)系统托盘图标(显示此状态)是一个标准且相当干净的解决方案 - 它可以永久可见或只是在它出现时是相关的,它就像你可以获得的那样非侵入性,同时仍然将信息引起用户的注意,并且用户可以很容易地定期检查以确保他们有“绿灯”。
视觉指示器的替代方案是使用音频警报。
(例如,我们在构建服务器上使用了一个监视器。当构建良好时它只有一个绿色图标,如果构建失败,它会有一个红色图标。这是完美的,因为它不会打扰我除了我可以立即检查构建状态。
替代示例:我有一个电子邮件应用程序,当我有新电子邮件时,系统托盘中会显示“信封”图标,如果我没有,则没有。在这个系统的实践中,我很快就注意到了(一两分钟内)邮件已经到达,但我不会被常量弹出窗口或消息框所困扰。
我认为这些都是显示系统托盘图标比弹出窗口或气球窗口好多少的示例。弹出窗口很刺激,如果你不看的话,大多数都会出现,你会错过这些信息。我永远会发现弹出窗口就像它们消失然后不得不打开应用程序以查明它们是否告诉我任何有用的东西。通常他们不是。音频通知也是如此:我一直听到来自我的IM应用程序的随机噪音,并想知道他们的意思是什么。)
答案 3 :(得分:0)
取决于你的场景:如果事件需要用户交互来解决,那么模态对话框可能是最好的方法,因为你不能继续,直到用户,例如,将设备插入USB端口(或任何其他) )。
对于用户可能需要了解但可能不会中断工作流程的其他异常通知,我建议使用应用内弹出式Toast或更新状态窗口。
如果用户不需要更改/中断他们正在做的事情,那么请不要警告/通知他们:您的设备和应用程序应该“正常工作” - 如果有真正的东西,用户应该被打断需要他们的注意力,否则会很快导致他们中断。
答案 4 :(得分:0)
这在控制的右侧放了一个小红圈。它有点datagridview单元格erroText风格
var errorProvider1 == new ErrorProvider();
protected void textBox1_Validating (object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
int x = Int32.Parse(textBox1.Text);
// Clear the error.
errorProvider1.SetError(textBox1, "");
}
catch (Exception ex)
{
errorProvider1.SetError(textBox1, "Not an integer value.");
// additionally, if you wantto prevent user leaving textbox
// until he satisfies condition. uncomment below.
// e.handled = true;
}
}