How can I make an endless progressbar in WinForms?

后端 未结 6 1985
独厮守ぢ
独厮守ぢ 2020-12-05 21:11

I don\'t know how long an action could take and I want to display a progress bar to the user in a dialog box. I\'ve tried using System.Windows.Forms.ProgressBar but it doesn

6条回答
  •  一整个雨季
    2020-12-05 21:36

    This is what worked for me. I create a indeterminate progressbar for you. Add an custom control to your project/form and insert this code:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace AnimatedCustomControls
    {
      sealed class IndeterminateProgressbar : Control
      {
        private readonly List positions = new List();
        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);
        }
    }
    

    }

    You should then build your solution and when you go back to the designer, the new control should be in your toolbox. Drag it into you form, set the maximum and minimum value and that's all.

    I've created a sample program to let you know how it is used:

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

提交回复
热议问题