3. 用户的操作
对于用户来说,操作越简单越好,程序的使用思路越清晰越好。下面结合环境简单说明一下常用控件该如何合理使用。
3.1对于较长时间的运算:
建议使用进度条(progress bar)比如要进行数据库操作,需要时间长的情况。使用进度条可以让用户有个等待的时间,否则用户不知道你的程序在干什么,用户对于不明不白花费的时间一般容易恼火。设计的时候,对自己的操作运算时间进行估算,确定是否需要使用。如果只有5秒钟,用户一般是可以忍受的,加入进度条反而会产生画蛇添足的效果。
在使用进度条的同时,可以配合使用状态栏。StatusBar经常被放置在窗体的下面,建议使用dock。可以在状态栏中提供多个面板(pane)来提供不同的信息。 状态栏中,通常都会有一个面板来提示程序运行的信息,例如显示进度,时间等。需要扩展的话,需要owerndrawn属性支持。可以添加按钮等,如取消。一般,在长时间的后台运算开始时,在状态栏中设置开始的状态信息,在计算结束之后,清除状态信息或将状态信息设置为停止状态,在后台运行期间通过状态栏来显示必要的错误信息,提示用户当前的状态。比如,进行一个计算时,开始显示:正在计算,请耐心等待。当运算结束时显示:可以结束,正确退出。
等待指针的使用,在进行计算的时候,尤其在很难计算出这些操作的进度的情况下,设置前台鼠标指针为wait cursor是对用户一个很好的提示。如果有些操作必须是阻塞的,这时需要使用等待指针(wait cursor)也是对用户很好的交代。同样,光标的形状是非常灵活的,合理的使用能够给用户恰当的提示。
总之,使用上面的控件,能通过可视化的方式通知用户有一些程序正在执行过程中,可能需要等待一定的时间。
在程序中合理使用try…finally语句可以达到很好的效果。保证无论遇到什么情况,是正常也还,是异常也好,反正最后都会执行到finally。
3.2操作开始之后,在适当的时候提供必要的程序开关。
用户应当能够通过界面操作取消或终止较长时间的运算。不管你在做什么,都要给用户一个机会,因为用户是程序的使用着。当然,不能让用户,任何时间都可以插手程序的操作,比方,一个数据保存的界面,保存,关闭,取消三个按钮,当正在保存数据的时候,如果强行关闭的话,会导致数据的异常,在这种情况下就需要适当的启用,禁用控件。对于该界面来说,“保存”点击后,禁用“关闭按钮”。在保存处理完毕后,再启用“保存按钮”。
3.3适时合理禁用一些菜单
通过可视化的方式提示用户在运行某些程序的时候某些功能是被禁用的,程序结束后,重新启用一些被禁止的菜单和控件,并通过适当的方式提示用户操作已完成。同时,适当的启用禁用菜单可以使用户更清晰的理解应用程序的工作流程,理解应用程序执行的逻辑。比如用户,一般先要看你界面上什么功能可以使用,什么需要达到一定的前提才能使用。在执行某功能的时候,通过禁用启用,可以知道这个不能执行。当执行完毕后,用户发现,哦,那个按钮亮了,可以执行了。
3.4验证用户的输入,使用validation control。
避免因为用户的失误,导致程序的失败,意外。使用界面友好的MessageBox,注意要在提示对话框中使用适当的按钮和图标,它的重载比较多,根据具体的情况选择不同的图标和按钮。比方说,如果用户强行退出,可以弹出警告,这个时候就应该告诫用户可能产生的不良后果。
3.6使用适当的控件
使用TreeView控件来显示有层次的数据,使用ListView来显示一组具有多个列的数据,使用DataGrid控件可以让用户改变每一个单元格中的数据,使用TabControl可以将窗体中的控件按照使用逻辑进行分类,根据具体的需要开发复合控件,扩展控件,自定义控件。
3.7 合理使用Splitters Docking与Anchoring属性
当窗体放大时,你的窗体上的各种元素是否能够按照比例放大,并且填充区域呢。
用Splitter控件来分离用户区域,使用Dock属性的Fill选项使控件能够填充屏幕的一部分,设置Anchor可以在窗口大小变化时,保证窗体中的控件与窗体的相对位置不发生变化。通过设置
3.8不同分辨率下显示效果的自动调整。
考虑到用户的使用环境,程序在高分辨率下,字体,图片,显示需要随着分辨率自动调整,以满足用户的视觉效果。
3.9通过使用Common Dialog可以让用户通过熟悉的界面来实行标准的操作
ColorDialog,FontDialog,OpenFileDialog等等
3.10对于较长时间的操作,不要阻塞主线程,也就是UI线程
如果时间长的话,建议使用多线程。可以使用ThreadPool.QueueUserWorkItem()来进行异步调用。在该类中,管理线程,QueueUserWorkItem:将方法变成代理,将代理交给QueueUserWorkItem,如果没有其他线程,则立即计算,否则需要等待,给用户提供 取消/停止 的功能。从其它线程中更新用户界面中的控件,需要使用BeginInvoke和delegate。Hook,当前线程中调用的方法,获得另外线程中的方法,在另外的线程中操作。不是用来创建线程,只是让线程去执行想执行的方法。代理 函数指针的封装,自己作为对象 在程序中传递,实现callback机制。在NF2中,使用辅助线程Backgroundworker
3.11关闭确认原则。关闭需要激活原则,使权限不够的用户不能关闭程序。对实时软件尤其重要。