Subclassed ProgressBar未更新值

时间:2015-11-22 12:16:47

标签: c# inheritance progress-bar setter custom-component

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

我在这里找到了一个很棒的answer如何改变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);
                }
            }
        }
    }
}

控件显示在工具箱中。

enter image description here

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

知道我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:1)

不要忘记将值传递给基类,否则基础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);
        }
    }
}

答案 1 :(得分:1)

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

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

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