2009-03-11 18 views
10

मुझे नहीं पता कि कोई कार्रवाई कितनी देर तक ले सकती है और मैं एक संवाद बॉक्स में उपयोगकर्ता को प्रगति पट्टी प्रदर्शित करना चाहता हूं। मैंने System.Windows.Forms. प्रोग्रेसबार का उपयोग करने का प्रयास किया है लेकिन ऐसा लगता है कि यह इसका समर्थन नहीं करता है।मैं WinForms में एक अंतहीन प्रगति पट्टी कैसे बना सकता हूं?

जो मैं चाहता हूं उसका एक उदाहरण प्रगति पट्टी है जो विंडोज़ आपको इंटरनेट पर नए ड्राइवरों की तलाश में दिखाता है। यह सिर्फ तीन या चार 'बार' प्रगति पट्टी पर आगे और आगे मार्की शैली जा रहा है।

मैं यह कैसे कर सकता हूं?

उत्तर

24

System.Windows.Forms.ProgressBar एक संपत्ति Style कहा जाता है। Style को Marquee पर सेट करने से आपके प्रभाव को प्राप्त होगा।

संपादित करें:Divo अंक बाहर मार्की Style पर

Windows XP होम संस्करण, Windows XP प्रोफेशनल x64 संस्करण ही उपलब्ध है, विंडोज सर्वर है 2003

टिप्पणियों और भी अधिक जानकारी प्रदान करते हैं यह दर्शाता है कि जब तक आप .NET 2.0 या उच्चतर का उपयोग कर रहे हैं तब तक यह हर जगह काम करता प्रतीत होता है।

+0

लगता है माइक्रोसॉफ्ट जाने नहीं दे सकता "मार्की" पूरी तरह से जाने। :- डी – Tomalak

+4

इसे "विंडोज एक्सपी या उच्चतर" बनाएं। मैंने अभी विंडोज विस्टा और विंडोज 7 बीटा (हालांकि 64 बिट दोनों) पर परीक्षण किया है और यह काम करता है। – Joey

+0

नोट: यह एक .NET 2.0+ सुविधा है। .NET 1.1 ने स्टाइल प्रॉपर्टी का पर्दाफाश नहीं किया। –

6

बस एक एनिमेटेड GIF :)

का उपयोग आप यहाँ अपने खुद बना सकते हैं: http://www.ajaxload.info/

7

आप Marquee को System.Windows.Forms.ProgressBar की Style संपत्ति की स्थापना की कोशिश की है?

हालांकि, आश्चर्यजनक रूप से, इस संपत्ति ही उपलब्ध निम्नलिखित प्लेटफार्मों पर (MSDN के अनुसार) है:

Windows XP होम संस्करण, Windows XP प्रोफेशनल x64 संस्करण, विंडोज सर्वर 2003

शायद हो सकता है कि दस्तावेज़ को Vista में अद्यतन नहीं किया गया है। Vista पर एक सीमा के बारे में कोई भी जानता है?

संपादित करें: जैसा कि एक और टिप्पणी में पोस्ट किया गया है, समर्थित प्लेटफार्मों के संबंध में दस्तावेज गलत लगता है। विस्टा के साथ ही विंडोज पर काम किया जाना चाहिए 7.

0

वहाँ एक बेहतर तरीका हो सकता है, लेकिन एक तरह से बस वापस 0 करने के लिए (अपने कार्य को पूरा नहीं कर रहा है यह सोचते हैं)

+5

में इसका उपयोग करने की कोशिश नहीं करेगा, मुझे हर बार जब मैं ऐसा प्रोग्राम देखता हूं तो मुझे शारीरिक दर्द महसूस होता है। एक प्रयोज्यता पीओवी से, यह एक आलसी प्रोग्रामर कर सकते हैं सबसे बुरी चीजों में से एक है। यह पूरी तरह से "प्रगति पट्टी" - समकक्ष में अनौपचारिक, गलत, विचलित, कष्टप्रद और कम उपयोगकर्ता भरोसा है। यहां तक ​​कि कोई प्रगति पट्टी भी बेहतर नहीं है। – Tomalak

+0

सहमत हुए। शायद एक लंबी चल रही प्रक्रिया के लिए सबसे अच्छा समाधान जिसके लिए कोई प्रगति जानकारी कभी प्राप्त नहीं की जा सकती है (सवाल थोड़ा अस्पष्ट था), कोई प्रगति पट्टी नहीं होगी ... लेकिन हे, उसने पूछा कि कैसे अनिश्चितता प्राप्त करें:) – Joey

+0

ऐसा लगता है जैसे मैं वांछित प्रभाव को गलत तरीके से पढ़ता हूं। वह एकमात्र अनंत प्रगति पट्टी थी जिसे मैं अपने सिर के ऊपर से याद कर सकता था। – Davy8

1
स्थापित करने के लिए मूल्य जब यह अंत तक पहुँचता है

मुझे क्रिस लॉल का समाधान सबसे अच्छा, बहुत अच्छा और साफ समाधान मिला है, जिसमें केवल एक gif http://www.ajaxload.info/ शामिल है और कोई गड़बड़ कभी प्रगति पट्टी समाप्त नहीं कर रही है।

+3

कोई गड़बड़ कभी प्रगति पट्टी समाप्त नहीं कर रही है? आपके पास करने के लिए मार्की की एनीमेशन को एक बार समाप्त करने के लिए सेट करना है और प्रगति पट्टी की दृश्यमान संपत्ति को गलत पर सेट करना है। इसका कोई जादू नहीं है। – Houman

1

यह मेरे लिए काम करता है। मैं आपके लिए एक अनिश्चित प्रगति पट्टी बनाते हैं। अपनी परियोजना/फार्म के लिए एक कस्टम नियंत्रण जोड़ें और यह कोड डालना:

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); 
    } 
} 

}

तब आप अपने समाधान का निर्माण करना चाहिए और जब आप डिजाइनर के लिए वापस जाओ, नए नियंत्रण अपने पिटारे में होना चाहिए ।इसे अपने रूप में खींचें, अधिकतम और न्यूनतम मान सेट करें और यह सब कुछ है।

मैं एक नमूना कार्यक्रम बनाया है ताकि आप जानते हैं कि यह कैसे किया जाता है यह बताने के लिए:

 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; 
    } 
संबंधित मुद्दे