我正在使用WinForms,我有3种形式。 FormA,FormB和FormC。
FormA创建FormB,FormB创建FormC。
我需要FormA知道FormC关闭的时间。 FormB没有参与。 我还有一个全局静态类,每个Form都可以访问。
我看过How to properly listen form events with another form和Propagating events from one Form to another Form in C#,但它们仅适用于侦听FormC的FormB。
如何在全局静态类中创建事件,以便FormA可以侦听FormC?
谢谢
答案 0 :(得分:0)
避免static
类和全局引用几乎总是100%更好。
最好传递一个Action<FormC>
,以便您通知FormC
将要关闭。
尝试一下:
FormA
public partial class FormA : Form
{
public FormA()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
var formB = new FormB(this.ClosingC);
formB.Show();
}
private void ClosingC(FormC formC)
{
MessageBox.Show("Closing C");
}
}
FormB
public partial class FormB : Form
{
public FormB()
{
InitializeComponent();
}
private Action<FormC> _closingFormC = null;
public FormB(Action<FormC> closingFormC)
: this()
{
_closingFormC = closingFormC;
}
private void Button1_Click(object sender, EventArgs e)
{
var formC = new FormC(_closingFormC);
formC.Show();
}
}
FormC
public partial class FormC : Form
{
public FormC()
{
InitializeComponent();
}
private Action<FormC> _closingFormC = null;
public FormC(Action<FormC> closingFormC)
: this()
{
_closingFormC = closingFormC;
}
private void FormC_FormClosing(object sender, FormClosingEventArgs e)
{
_closingFormC?.Invoke(this);
}
}
答案 1 :(得分:-1)
我将使用事件聚合。这是一个很小的Install-Package Caliburn.Micro.EventAggregator
使用方式
public class MyForm : Form, IHandle<MyEvent>
{
public MyForm()
{
SomeStaticPlace.EventAggregator.Subscribe(this); //Can be replaced with DI
}
public void Handle(MyEvent message)
{
//Act on event
}
}
并发布SomeStaticPlace.EventAggregator.Publish(new MyEvent(...));
答案 2 :(得分:-1)
这是带有静态事件FormClosed
的全局静态类:
public static class GlobalStaticClass
{
public static event FormClosedEventHandler FormClosed;
public static void OnFormClosed(object sender, FormClosedEventArgs e)
{
FormClosed?.Invoke(sender, e);
}
}
这是FormC
。引发FormClosed
事件:
public partial class FormC : Form
{
public FormC()
{
InitializeComponent();
this.FormClosed += (sender, e) =>
{
GlobalStaticClass.OnFormClosed(sender, e);
};
}
}
这是FormA
监听的事件:
public partial class FormA : Form
{
public FormA()
{
InitializeComponent();
GlobalStaticClass.FormClosed += (sender, e) =>
{
//if (sender is FormC)
MessageBox.Show(((Form)sender).Name + " Closed, reason: " + e.CloseReason);
};
}
}