【问题标题】:Subclassed ProgressBar not updating the value子类 ProgressBar 不更新值
【发布时间】:2016-02-24 14:12:18
【问题描述】:

我需要根据我分配的值更改 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);
                }
            }
        }
    }
}

控件显示在工具箱中。

但是当我在代码中设置Value 时,ProgressBar 中什么也没有显示!

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

【问题讨论】:

  • 你的public int Value 应该给你一个关于隐藏基类成员的警告。这就是你的答案。
  • 哦,我明白了。抱歉,我对 C# 有点陌生。因此,由于我想覆盖该属性,因此我将签名更改为 public override int Value,但现在我收到错误 无法覆盖继承的成员,因为它没有标记为虚拟抽象或覆盖。我想在这一点上,没有什么可以做的?
  • 在类(F12)中查看,可能有一个虚拟的OnvalueChanged方法。
  • This 下面发布的答案解决了这个问题。您实际上可以为基类分配一个值。我不知道。感谢您的帮助。
  • 由于这不是虚拟的,我宁愿将新属性命名为 Value 以外的其他名称。让事情变得更加清晰。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多