WebCast听课录(8)

课程名:Windows应用程序开发入门到精通五:Windows应用程序界面美化

 

1,  当要进行长时间的计算工作时,不应该在用户界面(UI)主线程中进行从而阻塞主主线程,而应该开一个新的线程来进行。

 

2,  可以使用ThreadPool.QueueUserWorkItem()来进行异步调用。

 

3,  从其他线程中更新用户界面中的控件时,需要使用BeginInvokedelegate来进行。

 

     private   delegate   void  UpdateProgressDelegate(Single PercentDone);
        
protected   void  UpdateProgress(Single PercentDone)
        
{
            
if(InvokeRequired)
            
{
                
//marshall the call into the Main UI thread
                BeginInvoke(new UpdateProgressDelegate (UpdateProgress),new object [] {PercentDone});//来自外部的调用
                return;
            }

            
if (0==PercentDone) isCanceled = true;
            btnCancelProgress.Visible 
=!isCanceled;
            pbProgress.Visible
=!isCanceled;
            pbProgress.Value 
= (int)PercentDone;
            sbpStatus.Text
=pbProgress.Value + " % complete";
            
if(0==PercentDone)
                sbpStatus.Text 
= string.Empty;

        }


        
private   delegate   void  SetStatusTextDelegate( string  StatusText);

        
protected   void  SetStatusText( string  StatusText)
        
{
            
if (InvokeRequired)
            
{
                
//marshall the call into the main UI thread
                BeginInvoke(new SetStatusTextDelegate (SetStatusText),new object[]{StatusText});//来自外部的调用
                return;
            }

            sbpStatus.Text 
= StatusText;
        }

4,  若有些操作必须是阻塞的,而且很难计算出这些操作的进度,就需要使用等待指针(WaitCursor)。使用try….catch…finally并在finally中将鼠标的指针重新设置为默认状态。 对于时间较长的操作,要给用户提示当前完成的进度。

 

     try
            
{
                
this.Cursor = Cursors.WaitCursor;
                StatusBar1.Text 
= "Long process running";
                
for(int i=1;i < 50000000;i++)
                    ProgressBar1.Value 
= (int)(((float)i / 50000000* 100);
            
                StatusBar1.Text 
= "Long process done";
            }

            
finally
            
{
                
this.Cursor = Cursors.Default;
            }

5,  使用ListBox.Items.AddRange()可以增强性能,比使用Items.Add()方法要提高大约5倍左右。

 

6,  可以使用IComparer接口来自定义排序的方法。

 

         private   object []GetRandomIntArray( int  n)
        
{
        
object[] aintArray = (object[])Array.CreateInstance(typeof(object),n - 1);
            Random rnd 
= new Random();
            
for(int i = 0;i<aintArray.Length;i++)
            
{
                aintArray[i] 
= Convert.ToInt32( 
                    rnd.Next(
0, System.Int32.MaxValue));
            }

            
return aintArray;
        }

object []aintArray  =  GetRandomIntArray(Convert.ToInt32(TextBox1.Text));

        IComparer Comparer 
=   new  DescendingIntComparer();

        Array.Sort(aintArray, Comparer);

        
private   class  DescendingIntComparer :IComparer
        
{

            
public int Compare(object x, object y)
            
{
                
//Implement our own sorting logic however we want:
                return (-1)*Convert.ToInt32(x).CompareTo(Convert.ToInt32(y));
            }


        }


7,  VS安装文件夹下带了一个WizardFramework.dll,可以用于创建标准的”look and feel”向导程序。

8,  自定义绘制状态条:

     private   void  sbStatus_DrawItem( object  sender, System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
        
{
            
if(sbdevent.Panel.Equals(sbpProgress))
            
{
                Rectangle r 
= sbdevent.Bounds;
                r.Inflate (
1,1);
                pbProgress.Bounds 
= r;
            }

            
else if (sbdevent.Panel.Equals(sbpCancelButton))
            
{
                Rectangle r  
= sbdevent.Bounds;
                r.Inflate (
1,1);
                btnCancelProgress.Bounds 
= r;
            }

        }


        
private   void  frmBaseForm_Load( object  sender, System.EventArgs e)
        
{
            sbStatus.Controls.Add(btnCancelProgress);
            sbStatus.Controls.Add(pbProgress);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值