如何创建一个静态全局事件,以便一个窗体可以侦听不是父窗体的另一窗体的事件?

时间:2019-04-02 07:31:26

标签: c# events static

我正在使用WinForms,我有3种形式。 FormA,FormB和FormC。

FormA创建FormB,FormB创建FormC。

我需要FormA知道FormC关闭的时间。 FormB没有参与。 我还有一个全局静态类,每个Form都可以访问。

我看过How to properly listen form events with another formPropagating events from one Form to another Form in C#,但它们仅适用于侦听FormC的FormB。

如何在全局静态类中创建事件,以便FormA可以侦听FormC?

谢谢

3 个答案:

答案 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);
        };
    }
}