1  前言

一直想写一编关于Winform UI规范化开发的文章,客户总是抱怨我们程序界面不美观,操作不方便。作为程序开发者,工作重点往往在业务逻辑实现上,或许他们可以设计很好的算法,将系统的资源占用率降的更低,使运行效率提得更高。但这些高质量的逻辑代码的用户是看不到的;用户衡量程序的好坏,除了运行结果正确与否外,非常重要的一方面就是界面是否规范,操作是否方便。

写这篇文章之前在同学齐的QQ空间中看到关于WPF/XAML技术的一些讨论。刚接触WPF/XAML这个字眼的时候,竟然不知所云,后来与他联系才得知是微软在.Net3.5中推出的一套构建应用程序UI全新的技术体系。技术的更新速度实在令每个程序员汗颜,每次当我们深入的探讨某技术时,首先面临的就是该技术即将淘汰的问题。因此我们在下面的讨论中尽量避免各种原则的技术实现细节。

关于B/S和C/S。BS作为当今业界流行的应用程序体系确实给用户和开发带来了诸多方便之处。但是不是BS就能完全代替CS呢?从我们多年的实际应用开发经验中得知,答案是否定的。BS体系由HTML发展而来,而HTML最初的发明者没有预料到浏览器作为应用程序体系中的客户端来实现当前如此复杂的功能,尽管后来仍然有很多技术(诸如JavaScript,Web2.0等)扩充到当前体系中来,但仍不能使浏览器做到具有像Winform程序一样丰富的用户交互效果。当一套应用程序中如果客户端数量可预知情况下,我们应当以CS结构来实现应用系统。

2  Winform开发一般遵循的原则

2.1 窗体类型 

我们把UI理解成窗体以及窗体上用户的交互规则。窗体主要包括主界面类型和对话框类型两种。

主界面指应用程序启动后最主要的界面,其生命周期一般与应用程序保持一致。通过菜单或按钮的形式调用其它子界面和执行功能。一般由以下几个部分组成。 标题栏,菜单栏,工具栏,目录栏,工作区,信息输出区(栏)。此外很多应用程序中又增加一些漂浮的子窗体以面板的形式附加到主界面中。

对话框一般指应用程序中具有返回结果的窗体。一般表现为模态窗体,包括信息展现部分,信息输入部分和结果选择按钮三部分组成。

此外,UI部分除了主窗体和对话框外还有浮动窗体,托盘菜单等方式与用户交互。

2.2 窗体设计原则 2.2.1 IDE是典范 

不知道如何做界面,就去模仿Visual Studio。

程序员不是美工,不可能要求程序员像美工一样用Photoshop为应用程序设计UI窗体,尽管有很多程序员会使用Photoshop,甚至擅长于平面设计,但他们不是专业的,专业的平面设计和程序设计是完全不同的工作。也并非所有的应用程序都需要用专业的平面设计软件做出来的界面。IDE即是如此,IDE一般由操作系统提供的最基本的控件和经过封装的控件来构成,不同的IDE封装的控件外观大致相同。典型的例子是Delphi和Visual Studio .Net。

对话框一般指应用程序中具有返回结果的窗体。一般表现为模态窗体,包括信息展现部分,信息输入部分和结果选择按钮三部分组成。

此外,UI部分除了主窗体和对话框外还有浮动窗体,托盘菜单等方式与用户交互。

2.2 窗体设计原则 2.2.1 IDE是典范 

第一种窗体一般固定尺寸大小。结果按钮居中,第二种和第三种可以是Sizeable的窗体,结果按钮需要设置Anchor值来保持窗口大小更改后离窗口边框的距离。

注意窗口结果按钮的配对情况,一般是 Yes 和No, OK和Cancel配对使用,OK和Close也常用。但如过Yes和Cancel配合就不合时宜了。

此外,还应当给对话框指定Accept Button和 Cancel Button,Accept Button是窗体默认的按钮,当按回车键时将代替鼠标点击该按钮,同样点击Cancel Button和按Esc键效果是一样的。

按钮大小应该用鼠标在窗体设计器上单击产生的默认尺寸,除非按钮上文本太长否则不应该调整按钮的尺寸大小。这样做的好处就是系统中所有按钮大小保持一致。以鼠标拖拽的形式“画”出来的按钮,很难保证每次画的尺寸都一样。

2.2.4 Tab键次序 

Tab键次序问题非常容易被忽视,UI开发经常遇到这种问题:本来界面上有若干文本框供用户输入信息,后来因为需求的变更需要增加一个项插入到某个文本框之前,此时问题就随之而来,IDE对输入控件的Tab值不会因为其上下左右排列次序自动生成,而是与输入控件的先后创建次序一致,因此在程序运行时会出现Tab定位输入框“跳格”,这就给用户带来极大的不便,甚至造成错误的输入。

由此可见,在UI设计时一定要注意输入控件Tab键次序问题。

2.2.5 快捷键 

以下几种情况必须用快捷键操作程序:笔记本电脑没有可能没有外接鼠标,某些用户热衷键使用键盘,专业的操作人员为了提高工作效率不使用键盘。因此菜单和按钮要有快捷键。大部分Winform开发工具中只要设置菜单或按钮的Text属性包含 号“&”+ 字符形式的为本即可。例如:“增加(&A)”在运行期就是“增加(A)”,使用快捷键为“Alt+A”。

2.2.6 INI文件保存默认值

应用程序若要提高用户的工作效率,必须尽量减少用户重复性工作,输入类控件(文本框,复选框等)应当遵循具有默认值的原则,默认值分为两种,高频值和上次输入值。高频值实现较简单,只要根据实际需求设定输入控件的默认值为高频值即可,亦可写程序实现高频值的智能选取(类似中文输入法功能),但是笔者不提倡。

上次输入值一般由INI文件进行保存,当窗体对象创建时,读取INI进行加载保存到文件中的值。操作INI文件的具体实现可以参阅相关资料。在此需要注意的只有一点,尽可能早的保存INI文件。一般当确定按钮点击后实现其他业务逻辑之前,首先保存INI文件,这样可以避免后面因为业务逻辑异常而造成INI文件保存被取消的可能。也有人习惯在窗体对象的析构方法中保存INI,这就更不提倡了。在后来的语言中对象的释放越来越不可控,很难知道什么时候才能被调用,我们应尽量不去在析构方法中编写功能代码。

ComboBox控件默认值不设置情况下索引为-1而不是0,使用时一定要确定它是否可编辑,如果类似选择数字字典的形式,那么它一定是不可编辑的,如果不设置其类型属性使其可编辑,那么用户在实际操作过程中可能直接输入字符串,显然这是错误的。

2.2.7 右键菜单

右键菜单多用于容器类控件,通常用于对容器控件中包含的选中态元素进行操作,右键菜单一般不包含复选类菜单项,因为右键菜单默认情况下是不可见的。

2.2.8 避免重复嵌套面板 

不管是GroupBox,Panel,还是TabControl作为容器控件不应该重复嵌套太多。GroupBox包含RadioButton时,假如窗体只有一组RadioButton则不使用GroupBox。

2.2.9 UI开发异常处理 

目前主流的Winform开发工具中,都包含了异常处理功能。比如点击某个按钮出现异常时,应用程序并不退出,而是将异常信息以对话框的形式提示用户,并终止异常后的逻辑处理。因此在Winform程序中异常捕获语句除非有特殊的处理语句和抛出自定义异常外,一般不建议使用异常处理代码。例如以下伪代码:

Try {

// To do something ….

.}

Catch (Exception ex)

{

//这里必须有类似MessagBox之外的处理语句 或者throw 新的异常类对象, 比如关闭文件,关闭数据库连接等。

MessageBox.Show(“程序失败\n” + ex.Message);

}

假如必须使用MessageBox类的代码重新包装对用户的信息提示,那么必须注意不要把原来异常的信息丢失。这些异常信息是程序维护和开发人员所关心的。如果客户不能接受这类信息的展现,则以输出日志形式将异常信息保存到存储设备。

当然还有一类代码结构确实是捕获异常但不处理的情况,此时不适合上述原则。

3  结论

Winform开发过程中需要遵循的原则还有很多,我们没办法用有限的篇幅将所有情况一一列举。总的来讲,就是要使应用程序与操作系统的UI保持一样的风格和习惯,只有如此才能使用户更愿意使用和操作,真正达到用信息技术的力量服务于各行各业的目的。

转载于:https://www.cnblogs.com/xiongxuanwen/archive/2008/07/28/1992386.html

c# Winform应用程序开发规范相关推荐

  1. python笔记6 模块与包 程序开发规范 包 re sys time os模块

    模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他 ...

  2. 模块的使用,包,及程序开发规范

    1.模块的基础认识 为啥使用模块: 从文件级别组织程序,更加方便管理,且实现了功能的重复利用 提高开发效率 查看当前已加载模块: 打印sys.module,里面包含模块名与对象的映射 为模块起别名: ...

  3. Spark程序开发规范

    在编写SparkRDD程序时,经常要将本地开发好的代码,在本地测试完后,要打包成jar,并发布到集群上去跑一跑.这是通过命令行传入参数的友好性提示和规范编码就体现出来了,下面我将整理[Scala语言开 ...

  4. 【2019.06.16】Django + 微信小程序 实现微信小程序1——小程序基本信息,开发规范

    小程序基本信息 微信官方网站注册微信小程序账号 小程序开发规范 开发规范 - 目录规范.命名规范.代码规范 目录规范: utils(工具) pages(页面) compaonents(主键) thir ...

  5. 微信小程序开发规范文档

    微信小程序开发规范文档 摘自: https://shimo.im/docs/EZKacqyM018gmopv/read 目录规范 1.目录概述 组件文件 所有组件相关文件统一放在components目 ...

  6. 微信小程序开发中的二三事之网易云信IMSDK DEMO

    本文由作者邹永胜授权网易云社区发布. 简介 为了更好的展示我们即时通讯SDK强悍的能力,网易云信IM SDK微信小程序DEMO的开发就提上了日程.用产品的话说就是: 云信 IM 小程序 SDK 的能力 ...

  7. 桌面应用开发框架 - Windows桌面程序开发工具

    桌面应用开发框架 - Windows桌面程序开发工具 桌面应用开发 桌面应用开发是指基于Windows操作系统开发的应用程序,在Windows环境运行,包括32位\64位的应用程序, 从开发者层面讲, ...

  8. WinForm应用实战开发指南 - 如何设计展示应用程序主界面

    WinForm应用程序的开发,主窗口的界面设计一般都要求做的更好一些,可以根据不同的系统功能模块进行归类整合,能使客户迅速寻找到相关功能的同时,也能感觉到整体性的美观大方,因此主窗口的界面设计总是会精 ...

  9. 项目的命名规范,为以后的程序开发中养成良好的行为习惯

    代码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 代码编写规范使用范围:J2EE项目开发. 一.包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 1.s ...

最新文章

  1. Memcached实战之复制----基于repcached的主从
  2. TF之DD:实现输出Inception模型内的某个卷积层或者所有卷积层的形状
  3. 函数和常用模块【day04】:函数参数及调用(二)
  4. php 文档转html格式文件,php学习笔记之将word文档转化为HTML文件
  5. Retrofit网络请求参数注解,@Path、@Query、@Post、Body等总结(超级实用)以及以Json格式和form-data格式提交数据
  6. Android开发之高德地图无法显示地图的原因
  7. linux修改挂载目录名字,linux下修改mount挂载目录名
  8. Nginx编译-安装-配置-优化实践总结
  9. android 磁盘日志记录,GitHub - xflyandroid/XLog: 一个简易的日志打印框架(支持打印策略自定义,默认提供2种策略:logcat打印和磁盘打印)...
  10. 无人机怎么设定航线_飞行航线设置方法及装置与流程
  11. php获取客户端ip地址
  12. ldap 统一认证 java_LDAP统一用户认证
  13. 第十一届 蓝桥杯 单片机设计与开发项目 决赛
  14. 【Docker学习】【问题解决】Client.Timeout exceeded while awaiting headers
  15. 在VMWare虚拟机上安装CentOS 7
  16. Android N中UI硬件渲染(hwui)的HWUI_NEW_OPS(基于Android 7.1)
  17. 开发神技能 | Python Mock 的入门
  18. 软件项目外包找我(附案例)
  19. Apache Spark,Cassandra和《权力的游戏》
  20. BAT面试算法精品课直通BAT面试算法精品课购买优惠码-牛客网

热门文章

  1. cad lisp 两侧偏移并删除_CAD做钣金件展开的原理你知道吗?
  2. docker-compose 配置kafka_Docker Compose 引用环境变量
  3. 【算法】剑指 Offer 61. 扑克牌中的顺子 【重刷】
  4. 【Elasticsearch】搭建Elasitc stack集群需要注意的日志问题
  5. 【Clickhouse】Clickhouse 运算符 操作符 算术,比较,取整,逻辑,哈希,条件 字符串函数
  6. 60-127-040-源码-connector-Flink 1.9.0 with Hive
  7. 01-浏览器同源政策 以及 什么是跨域?怎么解决跨域问题?
  8. 95-190-454-源码-window-Trigger-Flink 自定义trigger
  9. Netty : 臭名昭著的JDK的NIO bug(空轮询bug)
  10. 如何修改Git仓库的URL(地址)