C# 子类ProgressBar不更新值

C# 子类ProgressBar不更新值,c#,inheritance,progress-bar,setter,custom-component,C#,Inheritance,Progress Bar,Setter,Custom Component,我需要根据指定的值更改ProgressBar的颜色。如果值高于50,则应为绿色;如果值介于20和50之间,则应为黄色;如果值低于20,则应为红色 我在这里找到了一个关于如何更改ProgressBar颜色的好方法。我对它进行了测试,效果良好。但是,它是作为扩展方法编写的 public static class ModifyProgressBarColor { [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = fa

我需要根据指定的值更改ProgressBar的颜色。如果值高于50,则应为绿色;如果值介于20和50之间,则应为黄色;如果值低于20,则应为红色

我在这里找到了一个关于如何更改ProgressBar颜色的好方法。我对它进行了测试,效果良好。但是,它是作为扩展方法编写的

public static class ModifyProgressBarColor
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);
    public static void SetState(this ProgressBar pBar, int state)
    {
        SendMessage(pBar.Handle, 1040, (IntPtr)state, IntPtr.Zero);
    }
}
我希望在为ProgressBar的
value
属性设置值时更改颜色,而不必手动指定它

所以我对ProgressBar类进行了子类化。这就是我所做的

using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MyApp
{
    class MyProgressBar: ProgressBar
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);

        public int Value
        {
            set
            {
                if (value > 50)
                {
                    SendMessage(this.Handle, 1040, (IntPtr)1, IntPtr.Zero);
                }
                else if (value < 50 && value > 20)
                {
                    SendMessage(this.Handle, 1040, (IntPtr)2, IntPtr.Zero);
                }
                else if (value < 20)
                {
                    SendMessage(this.Handle, 1040, (IntPtr)3, IntPtr.Zero);
                }
            }
        }
    }
}
使用System.Runtime.InteropServices;
使用System.Windows.Forms;
名称空间MyApp
{
类MyProgressBar:ProgressBar
{
[DllImport(“user32.dll”,CharSet=CharSet.Auto,SetLastError=false)]
静态外部IntPtr发送消息(IntPtr hWnd、uint Msg、IntPtr w、IntPtr l);
公共整数值
{
设置
{
如果(值>50)
{
SendMessage(this.Handle,1040,(IntPtr)1,IntPtr.Zero);
}
否则如果(值<50&&value>20)
{
SendMessage(this.Handle,1040,(IntPtr)2,IntPtr.Zero);
}
否则如果(值<20)
{
SendMessage(this.Handle,1040,(IntPtr)3,IntPtr.Zero);
}
}
}
}
}
控件显示在工具箱中

但是当我在代码中设置
值时,ProgressBar中没有显示任何内容


知道我这里缺少什么吗?

别忘了将值传递给基类,否则底层的
ProgressBar
将不知道该值已更改

public new int Value
{
    set
    {
        base.Value = value;

        if (value > 50)
        {
            SendMessage(this.Handle, 1040, (IntPtr)1, IntPtr.Zero);
        }
        else if (value < 50 && value > 20)
        {
            SendMessage(this.Handle, 1040, (IntPtr)2, IntPtr.Zero);
        }
        else if (value < 20)
        {
            SendMessage(this.Handle, 1040, (IntPtr)3, IntPtr.Zero);
        }
    }
}
公共新int值
{
设置
{
基本价值=价值;
如果(值>50)
{
SendMessage(this.Handle,1040,(IntPtr)1,IntPtr.Zero);
}
否则如果(值<50&&value>20)
{
SendMessage(this.Handle,1040,(IntPtr)2,IntPtr.Zero);
}
否则如果(值<20)
{
SendMessage(this.Handle,1040,(IntPtr)3,IntPtr.Zero);
}
}
}

值属性应按如下方式实现:

    public new int Value
    {
        set
        {
            // other things you do here...

            base.Value = value; // this was missing
        }
    }

您的
public int值
应该给出关于隐藏基类成员的警告。这就是你的答案。哦,我明白了。对不起,我对C有点陌生。因此,由于我想覆盖该属性,我将签名更改为这个
public override int Value
,但现在我得到了一个错误,即无法覆盖继承的成员,因为它没有标记为虚拟抽象或覆盖。我想在这一点上,没有什么可以做的?看看类(F12),可能有一个虚拟的OnvalueChanged方法。下面的答案解决了这个问题。实际上,您可以为基类指定一个值。我不知道。谢谢您的帮助。因为这在任何方面都不是虚拟的,所以我更愿意将新属性命名为其他名称,而不是
Value
。让事情变得更清楚。