如何将窗体's onPaint事件移动到自定义类

本文关键字:事件 onPaint 移动 自定义 窗体 | 更新日期: 2023-09-27 18:16:25

我有一个应用程序,我是通过使用我自己的"ThemeManager"类样式一些表单。相当基本的东西-我习惯使用CSS为web应用程序工作,并将此作为表单应用程序编写(由于各种原因不能是WPF)。

因此,我使用ThemeManager类对表单进行样式化,我可以在其中传递要样式化的表单:

主题管理器中的示例:

public void setTheme(Form sender)
{
//设置背景色和前景色
发送者。BackColor = ColorTranslator.FromHtml("#222222");
发送者。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);

并将此方法添加到thememmanager .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'

我怎样才能使它工作?

如何将窗体's onPaint事件移动到自定义类

PaintEventHandler委托(即Paint事件背后的类型)接受的sender参数类型为Object,而不是Form。(像所有其他标准事件委托一样)

如果你改变你的处理程序方法以object sender(然后将其转换回Form),它将工作良好