NET基础课--WinForm开发推荐3
用户体验
较长时间的运算:使用进度条(progress bar)
不要阻塞界面(UI)线程;使用多线程进行长时间的运算
状态栏(status bar)提示应用程序的状态
操作开始之后,用户应当能够通过界面操作取消或终止较长时间的运算
增强用户体验:使得用户可以通过界面来控制程序的运行
在适当的时候提供必要的程序开关
验证用户的输入,使用validation control
使用界面友好的MessageBox,注意要在提示对话框中使用适当的按钮和图标
进度条(progress bar)
对于时间较长的操作,要给用户提示当前完成的进度
对于较长时间的操作,不要阻塞主线程,也就是UI线程
可以使用ThreadPool.QueueUserWorkItem()来进行异步调用
可以使用提供 取消/停止 的功能
禁用一些菜单,通过可视化的方式提示用户在运行某些程序的时候某些功能是被禁用的
当程序结束后,重新启用一些被禁止的菜单和控件,需要使用BeginInvoke和delegate
状态栏
StatusBar经常被放置在窗体的下面,建议使用dock
我们可以在状态栏中提供多个面板(panel)来提供不同的信息
通常都会有一个面板来提示程序运行的信息,和一些其它的面板,例如显示进度,时间等
在长时间的后台程序之前,在状态栏中设置开始的状态信息
在后台程序结束之后,清除状态信息或将状态信息设置为停止状态
并在后台程序运行期间通过状态栏来显示必要的错误信息
演示一
进度栏(ProgressBar)和状态栏(StatusBar)
![]()
![]()
![]()
![]()
使用等待指针
如果有些操作必须是阻塞的,而且很难计算出这些操作的进度,这时需要使用等待指针(wait cursor)
通过可视化的方式通知用户有一些程序正在执行过程中,可能需要等待一定的时间
使用try……finally并在finally中将鼠标的指针重新设置为默认状态
演示二
设置鼠标的等待指针
![]()
![]()
禁止适当的控件
通过设置Enabled属性来控制控件是否可用,通过提示可视化的方式提示用户应用程序的执行状态
演示三
禁用(disable)/启用(enable)控件
![]()
![]()
![]()
UpdateProgress方法是主窗体的方法,而EmulateLongProcess是非主线程调用的一个方法。当EmulateLongProcess里面想调用主线程中的方法时,我们就要做判断。其中InvokeRequired是WindowsForm的一个成员,当它的值为真时,表示当前这个方法的调用不是在同一个线程内调用的。也就是说调用UpdateProgress方法的来源绝非当前窗体所在线程。BeginInvoke方法是将方法的调用转嫁到当前线程去调用。也就是说让当前窗体所在的线程重新去执行一遍UpdateProgress。
这样做是很必要的,因为当其他的线程想更新界面的元素的话,它最好去通知那个窗体的界面线程自己去更新。在这个例子中,当第一次进入UpdateProgress方法的时候是其他线程,因此它马上就会return。在return之前,它会让你的截面线程去调用Updateprogress。也就是说当第二次进入UpdateProgress的时候,InvokeRequired将变为false,界面线程就会执行下面的代码。这样在进度条走的时候,我们一样可以在主窗体上做其他事情,例如点击Stop让进度条停止。
![]()
![]()
使用适当的控件
使用TreeView控件来显示有层次的数据
使用ListView来显示一组具有多个列的数据
使用DataGrid控件可以让用户改变每一个单元格中的数据
使用TabControl可以将窗体中的控件按照使用逻辑进行分类
Splitters Docking与Anchoring
用Splitter控件来分离用户区域
使用Dock属性的Fill选项使控件能够填充屏幕的一部分
设置Anchor可以在窗口大小变化时,保证窗体中的控件与窗体的相对位置不发生变化
演示四
Controls
![]()
Common Dialog Controls
通过使用Common Dialog可以让用户通过熟悉的界面来实行标准的操作
ColorDialog
FontDialog
OpenFileDialog
PageSetupDialog
PrintDialog
PrintPreviewDialog
SaveFileDialog
演示五
Common Dialog
![]()
![]()
![]()
![]()
![]()
![]()
更多的Control
ImageList控件用于控制控件中使用的图像
ListView
TreeView
ToolBar
CheckedListBox
DateTimePicker
演示六
更多的控件
![]()
![]()
数组的性能
数组——使用ListBox.Items.AddRange()可以增强性能
使用Array.Sort对数组中的数据项进行排序
实现IComparer接口来自定义排序的方法
演示七
数组
![]()
![]()
Loop方式
![]()
AddRange方式
![]()
排序
![]()
使用向导
使用向导会给用户带来标准的“Look and feel”
使用向导能够让用户很容易就知道应该如何使用应用程序
那么,我们需要将用户的操作过程按照逻辑划分为若干步骤
参考资源
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\Microsoft.VisualStudio.WizardFramework.dll
演示八
制作向导
![]()
![]()
![]()
![]()
![]()
NET基础课--WinForm开发推荐3的更多相关文章
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇二:WinForm开发扇形图统计和Excel数据导出
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- WPF与WinForm开发有什么区别?
转自http://hi.baidu.com/leoliu83/blog/item/1d1a4a66dcb41134aa184cfd.html WPF开发于WinForm之后,从技术发展的角度,WPF比 ...
- Navi.Soft30.框架.WinForm.开发手册
阅读导航 Navi.Soft30.Core类库.开发手册 http://www.cnblogs.com/xiyang1011/p/5709489.html Navi.Soft30.框架.WinForm ...
- 基于BindingSource的WinForm开发
BindingSource控件介绍 BindingSource控件介绍 BindingSource控件是.NET Framework 2.0提供的新控件之一.BindingSource控件与数据源建立 ...
- C# WinForm开发系列 - 文章索引
该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm ...
- C# WinForm开发系列 - DataGrid/DataGridView
在WinForm开发中,DataGrid/DataGridView被广泛使用于绑定数据库中数据进行呈现.整理一些关于DataGrid/DataGridView使用的文章,涉及DataGrid/Data ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- Java进击C#——应用开发之WinForm开发
本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是 ...
- WinForm开发-界面控件到实体,实体到界面控件自动绑定
在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...
随机推荐
- iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程
iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程 一.引言 二.初识CoreAnimation 三.锚点对几何属性的影响 四.Layer与View之间的关系 ...
- map的类型映射
以下是使用STL中map类型,对类型的转换示例,主要可以解决的问题,也就是一般的类型之间的相互转换,可以较好的解决相关的问题. 以下是C++源码,比较简短,容易理解的. #include " ...
- EffectiveC#16--垃圾最小化
1.申请和释放一个基于堆内存的对象要花上更多的处理器时间. 所以当一个引用类型的局部变量在常规的函数调用中使用的非常频繁时应该把它提升为对象的成员(方法一) 2.当你把一个实现了IDisposable ...
- JS数组追加数组采用push.apply的坑(转)
JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...
- photoshop动作面板批量处理图片边框技巧
1,想给图片加上边框,在不改变图片大小的前提下,可以这样做:ctrl+a,全选图片,然后“编辑”-----“描边”,在跳出来的选项卡里面可以设置边框颜色,大小,位置,及混合模式, ,我们设置好了,就可 ...
- ASP.NET的Application简介1
ASP.NET中的Application 1. Application是用于保存所有用户共有的信息.在ASP时代,如果要保存的数据在应用程序生存期内不会或者很少改变,那么使用Application是理 ...
- 转帖:深入理解JavaScript系列
感觉汤姆大叔这个系列写的很是不错,很适合有js基础但是想深入又无从下手的朋友. 深入理解JavaScript系列
- 为js数组扩展方法
(function(global,undefined){ //javascript冒泡排序,直接添加到基础类型Array的原型上 Function.prototype.method = functio ...
- 网易2014校园招聘杭州Java笔试题
10) ABC http://soft.chinabyte.com/os/56/12516056.shtml 11) BD. 12) AC. http://blog.sina.com.cn/s/blo ...
- POJ 1020 Anniversary Cake(DFS)
Anniversary Cake Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit St ...