如何在单独的窗体中等待按钮事件

本文关键字:等待 按钮 事件 窗体 单独 | 更新日期: 2023-09-27 18:23:45

所以我有形式Foo和形式Bar。假设我已经制作了一个Bar对象,初始化它并显示它:

Bar b = new Bar();
b.Show();

酒吧有一个按钮。我需要使用一个事件,当它被推送时,会触发Foo中的一些代码。我无法在Bar中创建Foo的新对象,因为已经有活动变量之类的了。

有什么想法吗?

编辑:一种更简单的方法是在b.Show()之后停止代码,然后等待被调用的窗口执行此操作。Close();有办法做到这一点吗?

如何在单独的窗体中等待按钮事件

Bar:中声明一个新事件

public event EventHandler SomethingHappened;
private void OnSomethingHappened()
{
    var handler = SomethingHappened;
    if (handler != null)
        handler(this, EventArgs.Empty);
}

并在按钮的事件处理程序中触发它:

private void TheButton_Click(object sender, EventArgs e)
{
    OnSomethingHappened();
}

Foo中,订阅事件:

Bar b = new Bar();
b.SomethingHappened += Bar_SomethingHappened;
b.Show();
...
void Bar_SomethingHappened(object sender, EventArgs e)
{
    // Do whatever you need to do...
}

这种方法比将Foo的实例传递给Bar要好,因为这样Bar就不必知道任何关于Foo的信息,所以它减少了耦合。此外,您可以更容易地从另一个表单重用Bar

由于您在评论中提到Bar是一个在单击按钮时关闭的表单,因此您可以简单地使用现有的FormClosed事件,而不是定义自己的:

Bar b = new Bar();
b.Show();
b.FormClosed += (s, args) => DoStuff();

如果你想在点击按钮时执行一些操作,而表单不会同时关闭,那么你可以在Bar中定义一个自定义事件,可以这样做:

public class Bar
{
    public event Action MyButtonClicked;
}

然后在点击按钮时触发该事件:

public void buttonClicked(object sender, EventArgs args)
{
    if(MyButtonClicked != null) MyButtonClicked();
}

然后Foo可以订阅该事件:

Bar b = new Bar();
b.Show();
b.MyButtonClicked += () => DoStuff();

您可以使用合成

public class Bar
{
  private Foo f; 
  public Bar(Foo value)
  {
    f = value;
  } 
}
Foo f = new Foo(); 
Bar b = new Bar(f);

在Bar中的活动中,调用f.Method()