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中那样方便的方法直接就自动 ...
随机推荐
- boost 定时器.
#include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_service io; b ...
- 线程:CountDownLatch同步工具
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 类似计数器,当计数器的值为0时,继续往下执行. package ch03; import java.util.R ...
- XtraReport改变纸张方向
XtraReport纸张方向改变可以通过修改Landscape属性: Landscape=true 为横向输出 Landscape=false 为纵向输出
- PureLayout(轻量级自动布局)
直接整理用法 1.设置高度宽度 [view1 autoSetDimension:ALDimensionHeight toSize:70.0]; [view1 autoSetDimension:ALDi ...
- 进阶笔记(1)——JavaScript 语言精碎
调用:(调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数) 每个函数接受连个附加参数:this (取决于调用的模式).argument. js的四种调用模式及this指向: 1.方法调用:( ...
- leetcode_最长公共前缀
题目:Write a function to find the longest common prefix string amongst an array of strings. 题解:给出的函数为: ...
- MYSQL存储过程中-流程控制语句
存储过程中常用的流程控制 复习下存储过程内部的语法 定义存储过程体的局部变量: 定义方法:DECLARE a INT DEFAULT 100或者DECLARE a INT ; SET a=100; ...
- MySQL游标操作指南
本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下 测试表 level 代码如下: create table test.level (name varchar(20)); ...
- jquery插件编写
/*(function($) { $.fn.accordion = function(options) { var settings = $.extend({}, {open: false}, opt ...
- WPF下YUV播放的D3D解决方案
http://blog.csdn.net/yangyy9611/article/details/17464133