DateTimePicker UserControl上的动态文本颜色

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

我有一个公共属性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);
}

哪些工作,种类,但导致一些令人震惊的结果,即

  • 即使是这样,控件也不会显示出来。
  • 点击up / down控件可以改变控件的基础值,但并不总是改变可见值。
  • 当通过另一个控件更改其值时,该控件无法正确重绘,但将鼠标移到控件上似乎会强制重绘。
  • 看看这个奇怪的例子...

    我错过了什么?


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

    添加双缓冲区:

    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();
    }
    
    链接地址: http://www.djcxy.com/p/62003.html

    上一篇: Dynamic text Colour on DateTimePicker UserControl

    下一篇: SplitContainer Panel Resize Issue