在事件处理程序的调用者退出后运行代码

时间:2017-04-09 22:04:02

标签: c# winforms event-handling

在以下示例中,是否可以在控件的Do X完成后执行Do Y(即,退出调用我的事件处理程序的方法)?似乎Do X的行为与Do Y混淆,因此在Do X完成后需要Do Y完成。

//at form initialisation
someThirdPartyControl.MouseDoubleClick += MyHandler;

void MyHandler(...)
{
    e.Handled = true;
    //Do X
}

//The control's code may be something like
class SomeThirdPartyControl:Control
{
  void override OnMouseDoubleClick(...)
  {
     //call event handlers
     //Do Y
  }
}

Do X可能会改变控件的大小,因此项目的位置可能会发生变化,当发生这种情况时,控件会错误地选择双击后鼠标指针所在的项目。例如,我双击Item 4,但Do X更改了控件的大小,Do X完成后,Item 2位于鼠标指针下方,该控件选择Item 2。我想要的是所选项目保持Item 4

3 个答案:

答案 0 :(得分:1)

如果您继承SomeControl并覆盖OnMouseDoubleClick,则只能执行此操作:

class MyControl:SomeControl
{
  void override OnMouseDoubleClick(MouseEventArgs e)
  {
     base.OnMouseDoubleClick(e)
     //call event handlers
     //Do X
  }
}

您甚至可以定义新事件AfterMouseDoubleClick并触发该事件,而不是在OnMouseDoubleClick中调用X.

class MyControl:SomeControl
{
  public event MouseButtonEventHandler AfterMouseDoubleClick;

  void override OnMouseDoubleClick(MouseEventArgs e)
  {
     base.OnMouseDoubleClick(e)
     //call event handlers
     OnAfterMouseDoubleClick(e)
  }

  void virtual OnAfterMouseDoubleClick(MouseEventArgs e)
  {
     if(AfterMouseDoubleClick != null)
       AfterMouseDoubleClick(this, e)
  }
}

但是你应该考虑在X中做什么来弄乱Y.

答案 1 :(得分:0)

是的,这很容易,你只需要继承SomeThirdPartyControl。您甚至可以将其转换为另一个事件并以此方式使用它。

class MyWrapperControl : SomeThirdPartyControl
{
  public event MouseEventHandler AfterMouseDoubleClick;

  protected void override OnMouseDoubleClick(MouseEventArgs e)
  {
     base.OnMouseDoubleClick(e); //This will Do X.

     OnAfterMouseDoubleClick(e);
  }

  protected virtal void OnAfterMouseDoubleClick(MouseEventArgs e)
  {
       var temp = AfterMouseDoubleClick;
       if(temp != null)
           temp(this, e);
  }
}

用过。

//at form initialisation
myWrapperControl.AfterMouseDoubleClick += MyHandler;

void MyHandler(object sender, MouseEventArgs e)
{
    //This event is fired after all MouseDoubleClick events have been handled.

    //Do X
}

答案 2 :(得分:0)

OnMouseDoubleClick的基本实现调用事件,因此:

  1. 如果您不从OnMouseDoubleClick()调用基本实现,则不会触发MyHandler

  2. 您可以通过将base.OnMouseDoubleClick()放在任何需要的位置来控制调用的顺序。

    void override OnMouseDoubleClick(...)
    {
        // ...
        // Do Y
        base.OnMouseDoubleClick(); // Does X among other things...
    }