为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建一个静态全局事件,以便一个表单可以监听另一个不是父表单的表单事件?

如何创建一个静态全局事件,以便一个表单可以监听另一个不是父表单的表单事件?

C#
holdtom 2022-11-21 22:03:02

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

FormA 创建 FormB,FormB 创建 FormC。

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

我已经查看了如何使用另一种形式正确地侦听表单事件在 C# 中将事件从一种形式传播到另一种形式,但它们仅适用于 FormB 侦听 FormC。

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

谢谢


查看完整描述

3 回答

?
青春有我

TA贡献1508条经验 获得超8个赞

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);

    }

}


查看完整回答
反对 回复 2022-11-21
?
汪汪一只猫

TA贡献1597条经验 获得超8个赞

我会使用事件聚合。这是一个小的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(...));


查看完整回答
反对 回复 2022-11-21
?
烙印99

TA贡献1532条经验 获得超12个赞

这是带有静态事件的全局静态类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);

        };

    }

}


查看完整回答
反对 回复 2022-11-21
  • 3 回答
  • 0 关注
  • 7 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信