C# 禁用WinForms ProgressBar动画

C# 禁用WinForms ProgressBar动画,c#,.net,winforms,C#,.net,Winforms,是否可以禁用进度条的动画 我需要它的一些进程是暂停和不运行的时刻。如果进度条闪烁,一般用户会认为进程正在运行 创建自己的进度条控件的建议不是我想要的。向用户传达操作已暂停或无法准确测量的标准方法是使用字幕显示样式 progressBar1.Style = ProgressBarStyle.Marquee; 此样式忽略最大值和值属性,并显示一个进度条“段”,该段在进度条上不断移动并循环(它不会填充进度条,它会将看起来像进度条一部分的内容一直移动到控件上,然后再次移动到开始处。)您要做的是专门设置

是否可以禁用进度条的动画

我需要它的一些进程是暂停和不运行的时刻。如果进度条闪烁,一般用户会认为进程正在运行


创建自己的进度条控件的建议不是我想要的。

向用户传达操作已暂停或无法准确测量的标准方法是使用字幕显示样式

progressBar1.Style = ProgressBarStyle.Marquee;

此样式忽略
最大值
属性,并显示一个进度条“段”,该段在进度条上不断移动并循环(它不会填充进度条,它会将看起来像进度条一部分的内容一直移动到控件上,然后再次移动到开始处。)

您要做的是专门设置此控件上的样式以覆盖主题更改。这将为您提供一些信息。

您可以使用Vista进度条的暂停状态:


您可以重写progressbar的OnPaint()。实际上,您不需要重写整个过程,只需继承progressbar并重写OnPaint,如下所示:

public class my_progress_bar : ProgressBar {
        public Brush brush;
        public my_progress_bar() {
            this.SetStyle(ControlStyles.UserPaint, true);
            brush = Brushes.ForestGreen;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);
            Rectangle rectangle = e.ClipRectangle;
            rectangle.Width = (int)(rectangle.Width * ((double)Value / Maximum)) - 4;
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);
            rectangle.Height = Height - 4;
            e.Graphics.FillRectangle(brush, 2, 2, rectangle.Width, rectangle.Height);
        }
    }

将此粘贴为代码。这将重写进度条,它也可以自定义颜色

public class CProgressBar : ProgressBar
{

public Color MyColor {
    get { return _color; }
    set {
        _color = value;
        MyBrush = new SolidBrush(_color);
        Invalidate();
    }
}

private Color _color = Color.Green;

public CProgressBar()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
}

public int Value {
    get { return _value; }
    set {
        _value = value;
        Invalidate();
    }
}

private int _value;

private SolidBrush MyBrush = new SolidBrush(_color);

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.FillRectangle(MyBrush, new Rectangle(0, 0, Width * (_value / Maximum), Height));
}
}

我的解决方法是使用面板控件而不是ProgressBar。我更改了背景色、边框样式(改为Fixed3D),并操纵其宽度以显示所需的进度级别。我假设100%的进度等于表单的宽度


您是在谈论Vista的图形效果吗?大帐篷酒吧?是的。XP、Vista和W7效果。这可能与@JimFell相关,也可能重复@JimFell。感谢您投票结束此问题。然而,如果你仔细阅读,你会发现这些问题是完全不同的。请在他们两人身上看到公认的答案。谢谢。但我需要最大化和价值。用户需要查看进程暂停的位置。@Vasily:这是唯一独立于操作系统的过程;如果你保证Vista或7,那么SLak的答案应该能解决你的问题。看起来不错。但我怀疑我的老板会批准外观不标准的控件。你误解了;这将无法正确渲染。此外,还需要一个Vista样式栏。调用
ProgressBarnderer.DrawHorizontalChunks
会使效果更好。
e.ClipRectangle
是需要重新绘制的区域。您应该使用
this.ClientRectangle
。正如我在问题中所说,“创建自己的进度条控件的建议不是我想要的。”这个答案完全错误。在progressbar中永远不会调用OnPaint(),因为progressbar是由Windows(UxTheme.dll)绘制的,而不是由.NET framework绘制的。这正是我要找的。非常感谢。那个项目很棒:我自己也遇到了同样的问题。但有一个问题:这个解决方案是否也适用于将在XP上运行的软件,还是仅限于Vista/Win7?链接会导致缺少一个页面。最好在答案中复制并粘贴相关信息。@SLaks当它也是绿色时,有没有办法消除辉光效果?顺便说一句,它起作用了。如果有人倒数,那就意味着他太吝啬了,不能亲自尝试。我感觉到你,只是倒数投票,甚至不说为什么是非常不礼貌的。尽管在使用.NET4.5时代码存在很多问题:类需要是局部的,但MyBrush不能用非静态值初始化,并且最终没有绘制任何内容。我错了什么?由于int转换,宽度*(_值/最大值)始终为零。
public class CProgressBar : ProgressBar
{

public Color MyColor {
    get { return _color; }
    set {
        _color = value;
        MyBrush = new SolidBrush(_color);
        Invalidate();
    }
}

private Color _color = Color.Green;

public CProgressBar()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
}

public int Value {
    get { return _value; }
    set {
        _value = value;
        Invalidate();
    }
}

private int _value;

private SolidBrush MyBrush = new SolidBrush(_color);

protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.FillRectangle(MyBrush, new Rectangle(0, 0, Width * (_value / Maximum), Height));
}
}