子类 ProgressBar 不更新值
Subclassed ProgressBar not updating the value
我需要根据我分配给它的值更改 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
属性 设置值时更改颜色,而不必手动分配它。
所以我子class编辑了进度条class。这是我所做的。
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 中没有显示任何内容!
知道我在这里遗漏了什么吗?
不要忘记将值传递给基础 class,否则基础 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);
}
}
}
值 属性 应按如下方式实现:
public new int Value
{
set
{
// other things you do here...
base.Value = value; // this was missing
}
}
我需要根据我分配给它的值更改 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
属性 设置值时更改颜色,而不必手动分配它。
所以我子class编辑了进度条class。这是我所做的。
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 中没有显示任何内容!
知道我在这里遗漏了什么吗?
不要忘记将值传递给基础 class,否则基础 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);
}
}
}
值 属性 应按如下方式实现:
public new int Value
{
set
{
// other things you do here...
base.Value = value; // this was missing
}
}