所以我有表格 Foo 和表格 Bar。假设我已经制作了一个 Bar 对象,对其进行初始化并显示它:
Bar b = new Bar();
b.Show();
酒吧有一个按钮。我需要使用一个事件,当它被推送时,会触发 Foo 中的一些代码。我无法从 Bar 内部创建新的 Foo 对象,因为已经有活动变量等。
有任何想法吗?
编辑:更简单的方法是在 b.Show() 之后停止代码,然后等到被调用的窗口执行 this.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
to的实例要好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);
在您在酒吧的活动中,请致电f.Method()