如何在单独的窗体中等待按钮事件
本文关键字:等待 按钮 事件 窗体 单独 | 更新日期: 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()