更改值时禁用.NET progressbar动画?

更改值时禁用.NET progressbar动画?,.net,winforms,animation,progress-bar,.net,Winforms,Animation,Progress Bar,我意识到还有其他关于动画和进度条的问题,但它们似乎围绕着摆脱在进度条顶部绘制的动画,即在进度条上移动的高光 我想做的是去掉设置进度条新值时使用的动画。我现在遇到的问题是,正在运行的操作完成,然后在操作完成后,进度条继续增加到其最大位置 换句话说,如果我将progressbar的Value属性设置为50,我希望它立即移动到中间位置(如果max为100),而不是像现在这样缓慢地将progressbar建立到该位置 如果确实有一个问题,所以,已经处理了这个,只要关闭为重复,我会很高兴地删除它,但我找不

我意识到还有其他关于动画和进度条的问题,但它们似乎围绕着摆脱在进度条顶部绘制的动画,即在进度条上移动的高光

我想做的是去掉设置进度条新值时使用的动画。我现在遇到的问题是,正在运行的操作完成,然后在操作完成后,进度条继续增加到其最大位置

换句话说,如果我将progressbar的Value属性设置为50,我希望它立即移动到中间位置(如果max为100),而不是像现在这样缓慢地将progressbar建立到该位置

如果确实有一个问题,所以,已经处理了这个,只要关闭为重复,我会很高兴地删除它,但我找不到任何

这就是我发现的:,它处理的是动画的高光,这不是我要说的

下面是一个简单的演示,演示了问题:

void Main()
{
    using (var fm = new Form())
    {
        var bt = new Button
        {
            Text = "Start",
            Location = new Point(8, 8),
            Parent = fm,
        };
        var pb = new ProgressBar
        {
            Top = bt.Top + bt.Height + 8,
            Width = fm.ClientRectangle.Width - 16,
            Left = 8,
            Parent = fm
        };

        bt.Click += (s, e) =>
        {
            bt.Enabled = false;
            Thread t = new Thread(new ThreadStart(() =>
            {
                Thread.Sleep(1000);
                bt.BeginInvoke(new Action(() => { pb.Value = 50; }));
                Thread.Sleep(1000);
                bt.BeginInvoke(new Action(() => { pb.Value = 100; }));
                bt.BeginInvoke(new Action(() => { bt.Enabled = true; }));
            }));
            t.Start();
        };
        fm.ShowDialog();
    }
}
编辑1:这是Windows7的玻璃主题,所以是的,我打赌这是针对7的,也可能是Vista的

下面是一个显示问题的GIF动画,上面的项目。您可以看到,一旦按钮启用,在设置了中间标记后1秒,progressbar将在按钮启用后设置100%的动画

如上所示,将按钮设置回enabled(已启用)并将progressbar设置为100是“同时”完成的。基本上,我不希望progressbar的渐进式构建,我希望它直接跳到50%,然后在按钮启用的同时跳到100%


编辑2:回应David Heffernan的回答,我就是这样更改上述代码的:

bt.BeginInvoke(new Action(() => { pb.Value = 51; pb.Value = 50; }));
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Maximum = 101; pb.Value = 101;
                                  pb.Maximum = 100; pb.Value = 100; }));
该动画功能是在Vista中以Aero主题引入的

不过,还有一个变通办法。如果将进度向后移动,则不会显示动画。所以,若你们想让它瞬间增加50,增加值51,然后立即减少1

当接近100%时,您会陷入冲突,因为您无法将值设置为101(我假设最大值设置为100)。相反,将最大值设置为1000,例如,增加到1000,减少到999,然后移回1000


不管怎么说,这有点奇怪,但它确实有好处给你想要的效果

还有另一种方法可以跳过vista样式进度条的动画:
只需
SetState()
将控件设置为
PBST\u暂停
,然后设置该值,最后将其设置回
PBST\u正常

以下是我基于的扩展方法:

把它包起来,藏起来,假装它不在那里

公共静态类扩展方法
{
/// 
///设置进度条值,而不使用Windows Aero动画
/// 
公共静态void SetProgressNoAnimation(此ProgressBar pb,int值)
{
//如果没有任何变化,请不要重新绘制。
如果(值==pb.value)
返回;
//要绕过此动画,我们需要向后移动进度条。
如果(值==pb.最大值){
//特殊情况(无法设置值>最大值)。
pb.Value=Value;//设置值
pb.Value=Value-1;//向后移动
}
否则{
pb.Value=Value+1;//移动过去
}
pb.Value=Value;//移动到正确的值
}
}

我用VB解决这个问题的绝对方法

Sub FileSaving()

    With barProgress
        .Minimum = 0
        .Maximum = 100000000
        .Value = 100000
    End With

    For
        ...
        saving_codes
        ...
        With barProgress
            .Maximum = .Value * (TotalFilesCount / SavedFilesCount)
        End With
    Next

End Sub

现在遵循VB.NET2.0及更高版本的Jonathan Reinharts方法SetProgressNoAnimation。我希望这将帮助其他VB开发人员。 函数setProgressBarValue几乎崩溃。不过,硬件故障会使它停机

“”
''在VB.Net中,可以在没有动画的情况下设置进度条的值。
''预先设置最小值和最大值。
''此VB版本由荷兰蒂尔堡的EAHMK(Evert Kuijpers)编写。
''参见中的SetProgressNoAnimation
''' https://stackoverflow.com/questions/5332616/disabling-net-progressbar-animation-when-changing-value/5332770
“Jonathan Reinhart根据David Heffernan的建议。
''' 
''' 
''显示新值的进度条。
''' 
''' 
''要在进度栏中显示的新值。
''' 
公共函数setProgressBarValue(progressBar作为progressBar,
newValue(作为整数)作为异常
尝试
"不支持极端。
如果newValue<进度条最小值_
或newValue>progressBar.最大值_
或进度条。最大值=进度条。最小值_
或者progressBar.max=Integer.MaxValue然后
返回新ArgumentException(“值”&CStr(newValue)&for”_
&“进度条'”&progressBar.Name&“'超出范围。”)
如果结束
'By field MaximumReach还支持进度条值progressBar.Maximum。
尺寸最大值达到布尔值=新值=进度条。最大值
如果达到最大值,则
progressBar.最大值+=1
如果结束
progressBar.Value=newValue+1
progressBar.Value=newValue
如果达到最大值,则
最大进度条-=1
如果结束
'该值已成功显示在进度栏progressBar中。
一无所获
特例
'返回异常,但不会对其崩溃。
退换货
结束尝试
端函数

这会立即转到中途标记;没有积累。在XP上;可能是特定于操作系统的,您是否使用Vista/7?这是Windows 7,64位,让我编辑问题并发布一个示例视频。另外,谢谢你添加了这个标签:)很有趣,我偶然发现这个问题,我认为我的代码有一个延迟,因为动画实际开始需要100毫秒。好的,我可以接受
Sub FileSaving()

    With barProgress
        .Minimum = 0
        .Maximum = 100000000
        .Value = 100000
    End With

    For
        ...
        saving_codes
        ...
        With barProgress
            .Maximum = .Value * (TotalFilesCount / SavedFilesCount)
        End With
    Next

End Sub