DateTimePicker UserControl上的动态文本颜色 - WinForms

时间:2013-12-11 12:16:17

标签: c# winforms user-controls datetimepicker

我正在基于DateTimePicker创建一个Windows用户控件。控件设置为仅显示时间,因此显示:

DateTimePicker time only

我有一个公共属性TimeIsValid:

public bool TimeIsValid
{
   get { return _timeIsValid; }
   set
   {
      _timeIsValid = value;
      Refresh();
   }
}

当此设置为false时,我希望文本变为红色。所以我用以下代码覆盖了OnPaint:

    protected override void OnPaint(PaintEventArgs e)
     {
        base.OnPaint(e);

        e.Graphics.DrawString(Text, Font, 
        _timeIsValid ? new SolidBrush(Color.Black) : new SolidBrush(Color.Red),
        ClientRectangle);

     }

这没有做任何事。所以在构造函数中我添加了以下代码:

public DateTimePicker(IContainer container)
{
    container.Add(this);
    InitializeComponent();
    //code below added
    this.SetStyle(ControlStyles.UserPaint, true);
}

哪种方式有效,但会产生一些令人震惊的结果,即

  • 即使控件显示,控件也不会显示。
  • 单击向上/向下控件可更改控件的基础值,但并不总是更改可见值。
  • 当通过另一个控件更改其值时控件不能正确重新绘制,但将鼠标移到控件上似乎会强制重新绘制。

例如,看看这种奇怪......

Partially repainted control

我错过了什么?

1 个答案:

答案 0 :(得分:2)

尝试继承这是一个糟糕的控制,但有些事情要尝试:

添加双缓冲区:

this.SetStyle(ControlStyles.UserPaint | 
              ControlStyles.OptimizedDoubleBuffer, true);

如果控件具有焦点,请清除背景并绘制高光:

protected override void OnPaint(PaintEventArgs e) {
  e.Graphics.Clear(Color.White);
  Color textColor = Color.Red;
  if (this.Focused) {
    textColor = SystemColors.HighlightText;
    e.Graphics.FillRectangle(SystemBrushes.Highlight, 
                             new Rectangle(4, 4, this.ClientSize.Width - SystemInformation.VerticalScrollBarWidth - 8, this.ClientSize.Height - 8));
  }
  TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle, textColor, Color.Empty, TextFormatFlags.VerticalCenter);
  base.OnPaint(e);
}

并在值更改时使控件无效:

protected override void OnValueChanged(EventArgs eventargs) {
  base.OnValueChanged(eventargs);
  this.Invalidate();
}