2009-03-11 11 views
10

Nie wiem, jak długo może zajść akcja i chcę wyświetlić pasek postępu dla użytkownika w oknie dialogowym. Próbowałem używać System.Windows.Forms.ProgressBar, ale wydaje się, że nie obsługuje go.Jak mogę utworzyć niekończący się pasek postępu w WinForms?

Przykładem tego, czego bym chciał, to pasek postępu, który pokazuje okno, gdy szuka nowych sterowników w Internecie. To właśnie trzy lub cztery "paski" przechodzą w przód i w tył w stylu markizy na pasku postępu.

Jak mogę to zrobić?

Odpowiedz

24

System.Windows.Forms.ProgressBar ma właściwość o nazwie Style. Ustawienie Style na Marquee osiągnie efekt, którego szukasz.

EDIT:Divo podkreśla Marquee Style jest dostępny tylko na

Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003

Uwagi zapewnić jeszcze więcej informacji wskazujące, że wydaje się to działać wszędzie, o ile używasz .NET 2.0 lub nowszego.

+0

Wydaje Microsoft nie może puścić „markizy” w całości. :-D – Tomalak

+4

Zrób to "Windows XP lub wyższy". Właśnie testowałem na Windows Vista i Windows 7 Beta (oba 64-bitowe) i działało. – Joey

+0

Uwaga: jest to funkcja .NET 2.0+. .NET 1.1 nie ujawnił właściwości stylu. –

7

Czy próbowałeś ustawić właściwość Style urządzenia System.Windows.Forms.ProgressBar na Marquee?

Jednak, o dziwo, ta właściwość jest dostępna tylko na następujących platformach (według MSDN):

Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003

Might Jednak dokumentacja nie została zaktualizowana do wersji Vista. Ktoś wie o ograniczeniu w systemie Vista?

EDYCJA: Jak napisano w innym komentarzu, dokumentacja wydaje się błędna w odniesieniu do obsługiwanych platform. Powinno działać na Vista jak i Windows 7.

0

Nie może być lepszy sposób, ale jest tylko jeden sposób, aby ustawić wartość na 0, gdy dojdzie do końca (zakładając, że zadanie nie jest kompletna)

+5

Czuję fizyczny ból za każdym razem, gdy widzę program robiący to. Z POV użyteczności jest to jedna z najgorszych rzeczy, jakie może zrobić leniwy programista. Jest to informacja nierozsądna, błędna, rozpraszająca, irytująca i zmniejszająca zaufanie użytkownika do "paska postępu" - metafora jako całości. Nawet żaden pasek postępu w ogóle nie jest lepszy. – Tomalak

+0

Uzgodnione. Prawdopodobnie najlepsze rozwiązanie dla długotrwałego procesu, dla którego nie można uzyskać informacji o postępie (pytanie było nieco niejasne), w ogóle nie byłoby paska postępu ... ale hej, zapytał, jak uzyskać nieokreślony jeden:) – Joey

+0

Wygląda na to, że źle odczytałem pożądany efekt. To był jedyny nieskończony pasek postępu, który mogłem zapamiętać z mojej głowy. – Davy8

1

Uważam, że rozwiązanie Chrisa Lawla to najlepsze, bardzo dobre i czyste rozwiązanie, które zawiera tylko gif http://www.ajaxload.info/ i bez bałaganu, tworząc niekończący się pasek postępu.

+3

Nie masz bałaganu, tworząc niekończący się pasek postępu? zrobić ustawienie animacji markizy na 0 po zakończeniu i ustawić właściwość Widoczny paska postępu na wartość false. To nie magia. – Houman

1

To właśnie dla mnie zadziałało. Tworzę dla ciebie nieokreślony pasek postępu. Dodaj formant niestandardowy do swojego projektu/formy i wstawić ten kod:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 

namespace AnimatedCustomControls 
{ 
    sealed class IndeterminateProgressbar : Control 
    { 
    private readonly List<int> positions = new List<int>(); 
    private readonly Timer tmrAnimation = new Timer {Interval = 5, Enabled = false}; 
    private readonly Timer tmrAddPosition = new Timer {Interval = 500, Enabled = true}; 


    public Color ProgressColor { get; set; } 
    public Color InactiveColor { get; set; } 

    public IndeterminateProgressbar() 
    { 
     DoubleBuffered = true; 
     SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 
     ProgressColor = Color.FromArgb(40, 190, 245); 
     InactiveColor = Color.FromArgb(40, 40, 40); 
     tmrAnimation.Tick += tmrAnimation_Tick; 
     tmrAddPosition.Tick += tmrAddPosition_Tick; 
     if (!DesignMode) tmrAnimation.Start(); 
    } 

    void tmrAddPosition_Tick(object sender, EventArgs e) 
    { 
     positions.Add(1); 
    } 

    void tmrAnimation_Tick(object sender, EventArgs e) 
    { 
     if (DesignMode) tmrAnimation.Stop(); 
     for (int i = 0; i < positions.Count; i++) 
     { 
      positions[i] += 2 + Math.Abs(positions[i])/50; 
      if (positions[i] > Width) positions.RemoveAt(i); 
     } 
     Invalidate(); 
    } 

    protected override void OnEnabledChanged(EventArgs e) 
    { 
     base.OnEnabledChanged(e); 
     if (Enabled) 
     { 
      positions.Clear(); 
      positions.AddRange(new[] { Width/10, Width/3, Width/2, (int)(Width * 0.7) }); 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     if (Enabled) 
     { 
      e.Graphics.Clear(BackColor); 
      foreach (int i in positions) 
      { 
       e.Graphics.DrawLine(new Pen(Brushes.Black, 4f), i, 0, i, Height); 
      } 
     } 
     else e.Graphics.Clear(InactiveColor); 

     base.OnPaint(e); 
    } 
} 

}

Następnie należy zbudować rozwiązanie, a kiedy wrócisz do projektanta, nowa kontrola powinna być w przyborniku .Przeciągnij go do formularza, ustaw maksymalną i minimalną wartość i to wszystko.

Utworzyłem przykładowy program poinformować, w jaki sposób jest on używany:

 private void Form1_Load(object sender, EventArgs e) 
    { 
     indeterminateProgressbar1.BackColor = Color.FromArgb(40, 190, 245); //it's an nice color ;) 
     indeterminateProgressbar1.Size = new Size(400, 4); //make it small in the height looks better 
     indeterminateProgressbar1.Visible = true; 
    }