如何将表单的onPaint事件移动到自定义类?

时间:2013-06-02 21:07:24

标签: c# themes custom-controls

我有一个应用程序,我可以通过使用我自己的" ThemeManager"来设置某些表单的样式。类。相当基本的东西 - 我以前习惯使用CSS来处理网络应用程序,并将其作为表单应用程序编写(由于各种原因无法成为WPF)。

因此,我使用ThemeManager类来设置表单样式,我可以在其中传递要设置样式的表单:

主题管理器的示例:

  

public void setTheme(Form sender)
          {
              //设置背景和前景色
              sender.BackColor = ColorTranslator.FromHtml("#222222");
              sender.ForeColor = ColorTranslator.FromHtml("#A6CE39");

        // Loop through controls on form
        foreach (Control c in sender.Controls)
        {
            if (c is Button) // Set the button style
            {
                Button btn = c as Button;
                btn.BackColor = ColorTranslator.FromHtml("#222222");
                btn.FlatStyle = FlatStyle.Flat;
                btn.FlatAppearance.BorderSize = 0;
            }

            if ((c is ComboBox) || (c is TextBox)) // Set dropdown and textbox style
            { 
                c.ForeColor = ColorTranslator.FromHtml("#A6CE39");
                c.BackColor = ColorTranslator.FromHtml("#2e2e2e");
            }
        }

    }

表单没有标题栏和边框,但我想在它们上面设置一个非常简单的边框。目前,我通过在每个表单上设置onPaint事件来执行此操作:

        public void RemoteControl_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(new Pen(ColorTranslator.FromHtml("#A6CE39"), 3),
                       this.DisplayRectangle); 
    }

在设计师中有这个:

            this.Paint += new System.Windows.Forms.PaintEventHandler(this.RemoteControl_Paint);

但是,我必须在每个表单上执行此操作,而我宁愿通过主题管理器执行此操作。

我已经尝试将其添加到SetTheme方法中:

 sender.Paint += new PaintEventHandler(MyForm_Paint);

将此方法添加到ThemeManager.cs类:

 private void MyForm_Paint(Form sender, PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(new Pen(ColorTranslator.FromHtml("#A6CE39"), 3),
                       sender.DisplayRectangle);
    }

这不起作用 - 我收到过载错误:

No overload for 'MyForm_Paint' matches delegate 'System.Windows.Forms.PaintEventHandler'

我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

PaintEventHandler委托(Paint事件背后的类型)采用类型为sender的{​​{1}}参数,而不是Object。 (像所有其他标准活动代表一样)

如果您更改处理程序方法以取Form(然后将其强制转换回object sender),它将正常工作。