【问题标题】:How can I make an endless progressbar in WinForms?如何在 WinForms 中制作无尽的进度条?
【发布时间】:2010-10-12 18:23:14
【问题描述】:

我不知道一个操作需要多长时间,我想在对话框中向用户显示一个进度条。我试过使用 System.Windows.Forms.ProgressBar 但它似乎不支持它。

我想要的一个示例是 Windows 在 Internet 上寻找新驱动程序时向您显示的进度条。进度条上只有三四个“条”来回选取框样式。

我该怎么做?

【问题讨论】:

    标签: winforms .net-3.5


    【解决方案1】:

    System.Windows.Forms.ProgressBar 有一个名为Style 的属性。将Style设置为Marquee就可以达到你想要的效果了。

    编辑: Divo 指出 Marquee Style 仅在

    上可用

    Windows XP 家庭版、Windows XP 专业 x64 版、Windows Server 2003

    cmets 提供了更多信息,表明只要您使用 .NET 2.0 或更高版本,这似乎在任何地方都有效。

    【讨论】:

    • 微软似乎不能完全放弃“字幕”。 :-D
    • 将其设为“Windows XP 或更高版本”。我刚刚在 Windows Vista 和 Windows 7 Beta(虽然都是 64 位)上进行了测试,但它确实有效。
    • 注意:这是 .NET 2.0+ 的功能。 .NET 1.1 没有公开样式属性。
    • 由于问题被标记为 .net3.5,我认为可以安全地假设提问者不会尝试在 .NET 1.1 中使用它
    【解决方案2】:

    您是否尝试将System.Windows.Forms.ProgressBar@987654321@ 属性设置为Marquee

    然而,令人惊讶的是,该属性仅在以下平台上可用(根据MSDN):

    Windows XP 家庭版、Windows XP 专业 x64 版、Windows Server 2003

    可能是文档尚未更新到 Vista。有人知道 Vista 的限制吗?

    编辑:正如在另一条评论中发布的那样,关于支持的平台,文档似乎是错误的。应该可以在 Vista 和 Windows 7 上运行。

    【讨论】:

      【解决方案3】:

      只需使用动画 gif :)

      您可以在这里制作自己的: http://www.ajaxload.info/

      【讨论】:

        【解决方案4】:

        我发现 Chris Lawl 的解决方案是最好的、非常好的和干净的解决方案,只需包含一个 gif http://www.ajaxload.info/ 并且不会创建永无止境的进度条。

        【讨论】:

        • 没有混乱创建永无止境的进度条?您所要做的就是在完成后将选取框的动画设置为 0,并将进度条的 Visible 属性设置为 false。它没有魔法。
        【解决方案5】:

        这对我有用。我为您创建了一个不确定的进度条。 将自定义控件添加到您的项目/表单并插入此代码:

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

        【讨论】:

          【解决方案6】:

          可能有更好的方法,但一种方法是在结束时将 Value 设置回 0(假设您的任务未完成)

          【讨论】:

          • 每次看到这样的程序时,我都会感到身体疼痛。从可用性 POV 来看,这是一个懒惰的程序员可以做的最糟糕的事情之一。它是无信息的、错误的、分散注意力的、烦人的,并且会降低用户对“进度条”的信任——整体而言。即使没有进度条也更好。
          • 同意。对于无法获得进度信息的长期运行过程(问题有点不清楚),可能最好的解决方案是根本没有进度条......但是,嘿,他问如何获得一个不确定的进度条: )
          • 好像我误读了想要的效果。那是我脑海中唯一能记住的无限进度条。
          • 如果进度条很长(说超过 10-30 秒,具体取决于人的耐心以及他们期望计算机运行的速度),那么没有进度条肯定会更糟。我通常会考虑杀死一个30 秒无进度指示后处理
          • @Davy8:我一直很喜欢徽标(即模拟时钟抽象)的想法,当某些事情发生(“文件复制”事件等)时会旋转一点。如果发生很多事情,它会快速旋转,如果发生的事情很少,它会缓慢旋转。如果进程死了,它根本不会旋转。
          猜你喜欢
          • 1970-01-01
          • 2013-06-12
          • 1970-01-01
          • 2011-04-19
          • 2012-08-21
          • 2020-10-26
          • 2011-04-26
          • 1970-01-01
          相关资源
          最近更新 更多