C# 在同一方法中处理多个控件的鼠标悬停

C# 在同一方法中处理多个控件的鼠标悬停,c#,.net,winforms,C#,.net,Winforms,我试图用同一方法处理多个控件的mouseover和mouseleave事件。我的表单有10个不同的按钮,我需要它们来处理鼠标事件。现在通常我会这样做: public Form1() { InitializeComponent(); button1.MouseEnter += new EventHandler(button1_MouseEnter); button1.MouseLeave += new EventHandler(button1_Mo

我试图用同一方法处理多个控件的mouseover和mouseleave事件。我的表单有10个不同的按钮,我需要它们来处理鼠标事件。现在通常我会这样做:

  public Form1()
  {
       InitializeComponent();
       button1.MouseEnter += new EventHandler(button1_MouseEnter);
       button1.MouseLeave += new EventHandler(button1_MouseLeave);
  }

  void button1_MouseLeave(object sender, EventArgs e)
  {
       this.button1.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.img1));
  }


  void button1_MouseEnter(object sender, EventArgs e)
  {
       this.button1.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.img2));
  }
但是,由于我有10个控件,它们基本上是以相同的方式处理的,我发现为每个控件单独使用一种方法是不切实际的,在我的例子中,它的20种方法可以做几乎相同的事情,但要使用不同的控件

因此,有没有一种方法可以将这些事件集成到一个事件中,并确定应该处理哪个控件

编辑:


如果可以确定哪个控件引发了事件,那么假设我有一个picturebox,它可以根据悬停的按钮更改图像。

是的,在分配处理程序时,对所有控件使用相同的事件处理程序。在处理程序内部,使用
if()
确定引发事件的控件

void SomeEvent_Handler ( object sender, EventArgs e )
{
    if ( sender == btn1 ) // event is from btn1
    {
        btn1....;
    }
    else if ( sender == checkbox1 ) // event is from checkbox1
    {
        checkbox1.....;
    }
}

您应该能够对所有控件使用相同的处理程序,特别是因为它是
控件
的共享属性,而不是
按钮

      public Form1()
      {
           InitializeComponent();
           button1.MouseEnter += control_MouseEnter;
           button1.MouseLeave += control_MouseLeave;
           button2.MouseEnter += control_MouseEnter;
           button2.MouseLeave += control_MouseLeave;
      }

      void control_MouseEnter(object sender, EventArgs e)
      {
           Control control = sender as Control;
           if (control != null)
               control.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.img1));
      }


      void control_MouseEnter(object sender, EventArgs e)
      {
           Control control = sender as Control;
           if (control != null)
               control.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.img2));
      }

当然,只需向所有事件订阅相同的方法,发送方就会给您一个按钮,该按钮导致了事件。

那么我如何确定哪个控件是发送方呢。请记住,我对c#是完全陌生的。如果每个控件都有单独的If块,最好使用单独的处理程序。。。这有什么帮助?@ReedCopsey是的,你是对的,尽管可以使用名称或标记属性合并一些逻辑。这是一种编程风格。我通常只是咬紧牙关,使用单独的处理程序,但我可以看到只使用一个函数来处理所有类似控件的优势。当大多数控件使用相同的代码,但有些控件的代码稍有不同时,这非常有用。@xxbbcc我将对其进行重构,使其具有调用共享方法的单独处理程序。这样做实际上(很可能)会减少代码行数,而且更有意义,因为每个方法都有一个目的。@ReedCopsey是的,这也可以起作用。我通常试图保持最小的代码和最大的分离,但对于UI逻辑,有时很难做到这一点。我并不是说这种方法比任何其他方法都好——我只是把它看作是另一种工具。我同意你的观点,但我也不否认这种方法。所以有没有一种方法可以确定这种控制到底是什么。我可以将其与现有控件进行比较吗。假设我必须在图片框中显示一个图像,并且图像会根据悬停的控件而变化?@RedSerpent是的,这是可能的,看看我的答案,我在
中添加了更多细节,如果你想检查特定控件,我会有单独的事件处理程序(可能还有他们都使用的共享方法)。如果要检查控件类型,可以使用
Button-Button=sender-as-Button,然后以相同的方式处理所有“按钮”实例。