C# 子类ProgressBar不更新值
我需要根据指定的值更改ProgressBar的颜色。如果值高于50,则应为绿色;如果值介于20和50之间,则应为黄色;如果值低于20,则应为红色 我在这里找到了一个关于如何更改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
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
。让事情变得更清楚。