coordinator's planet

叶子 是不会飞翔的翅膀

翅膀 是落在天上的叶子

posts - 89,comments - 251,trackbacks - 5

演示程序下载

源文件下载

翻译如下:

                              
介绍 

在一些项目中,你需要来告诉用户任务进展的多快。以往你可能会用一个标签(Label)或一个状态栏(Status bar)加一个进度条(Progress bar)来告诉用户任务现在执行到哪一步了。这个控件可以轻松实现上面的要求,它展示所有需要被执行的任务,而且当每项任务完成后都会在它前面画个勾。

使用代码

    使用这个控件非常容易。只要在你的Windows Forms项目中添加对ProgressTaskList.dll(包含在SourceDemo项目中)的引用就行了。如果它没有出现在VS的工具箱(ToolBox)中,你就右键点击工具箱选择“添加/移除项”然后浏览到那个dll点确定即可。之后就可以把这个控件拖拽到窗体上了。

你可以通过Visual Studio的设计器设置任务。找到TaskItems属性,安后点击(Collection)按钮编辑条目,每行写一个任务。
    或者通过手写代码的方式设置任务:

 

// 用AddRange()一次添加多条任务
this.progressTaskList1.TaskItems.AddRange(new string[]{"Loading"
       
"Initialising""Whatever""Saving"}
);

// 或使用 Add() 方法一条条添加
this.progressTaskList1.TaskItems.Add("Loading");
this.progressTaskList1.TaskItems.Add("Initialising");

    你需要调用Start()来在控件中绘制任务,然后当一个任务完成后调用NextTask()来启动下一个任务。

有意思的地方

    我惊奇的发现Panel控件里有一个叫ScrollControlIntoView的内建函数来确保指定控件可见。当我准备写自己的类似功能函数时,刚好发现Panel里面已经有了这个函数。我就用这个方法来确保当前任务总是可见的。在下面的截图里可以看到,如果面板表面被任务占满了,这个控件就会自动滚动,这还要多谢PanelAutoScroll属性。

                                      

工作原理

    这个控件有一个叫TaskItemsstring[]类型的属性,对应于需要被执行的任务。需要说明的是,这个控件和运行任务的线程没有任何关联,所以为了在下个任务执行前更新控件,程序必须在每个任务完成后调用NextTask()方法。
   
    当控件的
Start()方法被调用时,标签(label)就会被动态创建然后添加到面板(panel)上。每个标签左边都有一个图片,当任务完成后都会由箭头变成勾勾。

    这个控件的设计过程确实很简单。最难的部分(目前为止)就是使TaskItems集合属性在VS设计器里正常工作。这些经验将对我今后的控件设计有一定的帮助。

结论

    你可以没有任何限制的使用这个控件并且根据你的意愿修改它。如果你有时间,就将你对这个控件作出的改进发表上来(作为评论),我将更新这篇文章。

       ps这个控件可以满足一般的需要,但想要更改显示的图片、文字位置之类的还是得到源代码中改再编译。这个控件使用了控件的BeginInvoke方法来异步调用代理,好像可以在调用完方法后立即返回原来的执行位置吧,具体的原理和原因我也不清楚,有哪位高手可以指点一下么?

 

posted on 2005-10-07 22:36 coordinator 阅读(2541) 评论(4) 编辑 收藏