2015-08-17 22 views
-1

如果我有一个窗体Form1我只是想知道的进度条,并宣布使用一个窗口形成递增另一种形式

public partial class Form1 : Form 
{ 
    GraphLoadProgress loadProgress; 

    public Form1() 
    { 
     loadProgress = new GraphLoadProgress(); 
     loadProgress.Show(); 
     // do some stuff 
     loadProgress.progress = 25; // increment by 25% 
     // more stuff 
     for (int i = 0; i < 65; i++) // increment by 65% 
     { 
     loadProgress.progress = 1; 
     } 
     // even more stuff 
     loadProgress.progress = 10; // increment by 10% 

     // blah blah 
     loadProgress.progress = 100; // make sure it goes over 100% 
    } 
} 

,并在我的GraphLoadProgress形式以下

public partial class GraphLoadProgress : Form 
{ 
    public int progress { get; set; } 

    private void StartBackgroundWork() 
    { 
     if (Application.RenderWithVisualStyles) 
      progressBar.Style = ProgressBarStyle.Marquee; 
     else 
     { 
      progressBar.Style = ProgressBarStyle.Continuous; 
      progressBar.Maximum = 100; 
      progressBar.Value = 0; 
      timer1.Enabled = true; 
     } 
     //backgroundWorker.RunWorkerAsync(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (progressBar.Value > progressBar.Maximum) 
      this.Close(); 
     progressBar.Increment(progress); 
    } 
} 

这显然不工作,因为计时器将更新和增量,即使我不想要它,有没有什么办法增加进度条,并且只在进度条仍在更新时增加一定量?

+0

友好亲建议给匿名downvoters:从不downvote没有留下评论。 – abatishchev

回答

1

你可以直接使用进度setter方法,是这样的:

private int _progress = 0; 
public int progress { 
    get { return _progress; } 
    set { 
     _progress = value; 
     if (progressBar.InvokeRequired) { 
      this.Invoke((MethodInvoker) delegate {progressBar.Value == value;}); 
     } else { 
      progressBar.Value = value; 
     } 
    } 
} 

这样,你可以从外部进度的值应该是什么设置。 InvokeRequired检查可以设置不同线程的值。

更加紧密地mimicing你会是一个只写属性(只有一个setter)的行为:

public int progress { 
    set { 
     if (progressBar.InvokeRequired) { 
      this.Invoke((MethodInvoker) delegate {progressBar.Increment(value);}); 
     } else { 
      progressBar.Increment(value); 
     } 
    } 
} 

您也可以随时只需添加一个公共Increment方法的形式。

public void IncrementProgress(int Value) 
{ 
    if (progressBar.InvokeRequired) { 
     this.Invoke((MethodInvoker) delegate {progressBar.Increment(Value);}); 
    } else { 
     progressBar.Increment(Value); 
    } 
} 

您应该在任何情况下为最大值添加检查以避免例外。

+0

任何机会,你会知道如何关闭加载窗口,一旦达到100%? – user3078930

+0

@ user3078930由于您可以控制改变进度条的所有路径(在设计器中将其设置为私有路径),因此您可以在setter中添加一个检查。改变这个值,如果它的> = 100,调用'this.close()'。 – Jens

相关问题