1

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

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

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

有任何想法吗?

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

4

3 回答 3

5

在 中声明一个新事件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...
}

这种方法比传递Footo的实例要好Bar,因为这种方法Bar不需要知道任何关于 的东西Foo,所以它减少了耦合。Bar此外,您可以更轻松地从其他表单重用。

于 2013-07-18T17:33:29.190 回答
4

由于您在评论中提到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();
于 2013-07-18T17:33:56.227 回答
1

您可以使用组合

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

}

Foo f = new Foo(); 
Bar b = new Bar(f);

在您在酒吧的活动中,请致电f.Method()

于 2013-07-18T17:33:02.767 回答