shilinc

导航

windows界面美化

windows界面美化
1、较长时间的运算:使用进度条(progress bar)
2、不要阻塞界面(UI)线程;使用多线程进行长时间的运算
状态栏(status bar)
3、操作开始之后,用户应当能够通过界面操作取消或终止较长时间的运算
4、增强用户体验:是的用户可以通过界面来控制程序的运行
5、在适当的时候提供必要的程序开关
6、验证用户的输入,使用validation control
7、使用界面友好的MessageBox,注意要在提示对话框中使用适当的按钮和图标

假如要作一个长时间的运算,则主界面要加一个ProgressBar和statusbar。
在button的click中:this.statusBar1.Text="Long process running...";
for(int i=0;i<50000000;i++)
{
this.progressBar1.Vaule=(int)(((float)i/50000000)*100);
}
this.statusBar1.Text="finished";
1、对于时间较长的操作,要给用户提示当前完成的进度
2、对于较长时间的操作,不要阻塞主线程,也就是UI线程
3、可以使用ThreadPool.QueueUserWorkItem()来进行异步调用
4、给用户提供 取消/停止 的功能
5、禁用一些菜单,通过可视化的方式提示用户在运行某些程序的时候某些功能是被禁用的
6、当程序结束后,重新启用一些被禁止的菜单和控件,并通过适当的方式提示用户操作已完成
7、从其它线程中更新用户界面中的控件,需要使用BeginInvoke和delegate
尽可能的使用try
catch
finally块,为用户设置等待指针。

StatusBar经常被放置在窗体的下面,建议使用dock
我们可以在状态栏中提供多个面板(pane)来提供不同的信息
通常都会有一个面板来提示程序运行的信息,和一些其它的面板,例如显示进度,时间等
在长时间的后台程序开始之前,在状态栏中设置开始的状态信息
在后台程序结束之后,清除状态信息或将状态信息设置为停止状态
并在后台程序运行期间通过状态栏来显示必要的错误信息

通过设置Enabled属性来控制控件是否可用,通过提示可视化的方式提示用户应用程序的执行状态
禁用适当的菜单
在长时间的程序开始之前,禁用对话框上的按钮
在程序结束之后,启用一些控件,提示用户可以进行下一步操作,示用户更容易理解应用程序执行的逻辑
使用禁用的控件,通过UI来帮助用户理解应用程序的工作流程
例:
public partial class Form1 : Form
    {
        public delegate void DoneDelegate(bool Done);
        public delegate void UpdateProgressDelegate(double percent);
        private bool isCanceled=false;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Thread t = new Thread(new ThreadStart(EmulateLongPrecess));
            t.Start();

        }
        private void EmulateLongPrecess()
        {
            double percentDone = 0;

            isCanceled=false;
            for (int i = 0; i < 100; i++)
            {
                if(isCanceled==true)
                {
                    break;
                }
                Thread.Sleep(10);
                percentDone = (Convert.ToDouble(i) / 100) * 100;
                UpdateProgress(percentDone);
            }
            DoneDelegate delDone=new DoneDelegate(Done);
                   
            BeginInvoke(delDone,new object[]{isCanceled});
        }
        private void Done(bool Stopped)
        {

        }
        protected void UpdateProgress(double percentDone)
        {
            if (InvokeRequired == true)//当前方法是否在当前线程内被调用
            {//把当前线程的调用转嫁到UI线程。
                BeginInvoke(
                new UpdateProgressDelegate(UpdateProgress), new object[] { percentDone });
                return;
            }

            this.toolStripProgressBar1.Value= Convert.ToInt32(percentDone);

        }
   
    }

在.net2.0下,可以使用匿名委托:

C# 2.0 匿名方法大大简化了 Windows Forms 异步调用的实现,我们再也不用手工定义异步委托或者包装类了。例如,在下面的代码示例中,Form1 有一个按钮控件和一个列表控件,在按钮控件的单击事件里,我们新建一个线程,在这个线程中向列表控件添加 10 个项目:

public class Form1 : System.Windows.Forms.Form
{
    private System.Windows.Forms.ListBox listBox1;
    private System.Windows.Forms.Button button1;

    ...

    private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(this.ThreadProc);
        thread.Start();
    }

    private void ThreadProc()
    {
        for (int i = 0; i < 10; i++)
        {
            this.Invoke((MethodInvoker)delegate
            {
                this.listBox1.Items.Add("Item " + (i + 1).ToString());
            });
        }
    }
}

使用TreeView控件来显示有层次的数据
使用ListView来显示一组具有多个列的数据
使用DataGrid控件可以让用户改变每一个单元格中的数据
使用TabControl可以将窗体中的控件按照使用逻辑进行分类

用Splitter控件来分离用户区域
使用Dock属性的Fill选项使控件能够填充屏幕的一部分
设置Anchor可以在窗口大小变化时,保证窗体中的控件与窗体的相对位置不发生变化

posted on 2006-04-07 17:56  SHILIN  阅读(1460)  评论(0)    收藏  举报