C# 简化单击事件方法以包含其他控件

C# Simplifying a click event method to include other controls

我想简化以下操作:单击面板,面板将其颜色更改为绿色,如果是绿色,则将其更改回灰色。我想知道如何将控件作为参数写入方法,以便它可以用于任何控件而无需复制事件方法。

通常:面板点击事件

panel_Click ()
   //some if statement
   panel1.BackColor = green
   panel1.BackColor = gray

然后每个对照重复。取而代之的是,我会创建一个所有控件都订阅的中央方法,读取面板的名称,如:

genericpanel_Click(){
  ChangeColor(thisPanelname);
}

然后这将利用 argument/parameter:

public void ChangeColor(panel? Mypanel) {
  //some if...
  Mypanel.BackColor = Green
  Mypanel.BackColor = Gray
}

此伪代码与有效代码的准确等价物是什么?

编辑:好的,是的,我现在可以看到它是重复的,无需进一步否决。我只是不知道具体要搜索什么。不管怎样,我现在已经找到了答案。

控件的所有事件都将其源作为第一个参数提供。您只需将其转换为正确的类型即可:

void panel_Click(object sender, EventArgs e) {
    Panel myPanel = (Panel)sender;
    ChangeColor(myPanel);
}

事件处理程序委托的所有定义都提供发送者,例如:

public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<T>(object sender, T e);

如果您定义自己的事件,只需使用这些委托类型并将事件源作为第一个参数传递。

您可以为所有面板订阅此方法:

private void panel_Click(object sender, EventArgs e)
{
    Panel clickedPanel = sender as Panel;
    if ( clickedPanel != null )
    {
        if ( clickedPanel.BackColor == Color.Blue )
        {
            clickedPanel.BackColor = Color.Red;
        }
        else 
        {
            clickedPanel.BackColor = Color.Blue;
        }
    }
}

如果您只订阅此面板,甚至不需要第一次检查,但为了安全起见,它就在那里。

此方法获取发件人(激活事件的面板)并检查其背景颜色。如果颜色 A 设置为颜色 B -> 否则颜色 A