0

独自の「ThemeManager」クラスを使用していくつかのフォームをスタイリングするアプリケーションがあります。かなり基本的なもの - 私は Web アプリの 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'

どうすればこれを機能させることができますか?

4

1 に答える 1

1

PaintEventHandlerデリゲート (Paintイベントの背後にある型) は、 ではなく type のパラメーターをsender受け取ります。(他のすべての標準イベント デリゲートと同様)ObjectForm

ハンドラー メソッドを take に変更するとobject sender(その後、 にキャストし直せばForm)、問題なく動作します。

于 2013-06-02T21:11:13.890 に答える