当我有两个非静态形式时,如何在它们之间进行事件

时间:2019-01-01 19:30:53

标签: c# winforms events

我在这里有两种形式,我想在c#winform中从一个函数调用另一个函数。我使用事件来执行此操作,但是它们不起作用。每次调用changeTheme()时,都会引发System.NullReferenceException错误:“对象引用未设置为对象的实例。”

我试图通过Main_form表单的实例给她打电话,但是它也不起作用。我也尝试了这些事件,但是当我添加一个函数来使其创建时,再次将其设置为null。但我想通过一个事件来完成它。

SDL2pp/SDL2pp.hh: No such file or directory

2 个答案:

答案 0 :(得分:0)

由于没有任何订阅事件,因此发生了空引用异常。

通常,您将创建一个这样的事件:

public event EventHandler<EventArgs> MyEvent;

与旧的事件/委托样式相比,它易于阅读,但工作方式完全相同。

并像这样射击它:

MyEvent?.Invoke(this, EventArgs.Empty);

这样,只有在您有订阅者的情况下,它才会触发。再次类似于if!= null触发较早的样式。

通过这种方式,您可以更简单地实现没有事件的目标。

如果您创建派生表单并在其中实现了更改代码,则可以从中创建其余表单,然后直接调用更改代码:

您的新基本表格:

public MyDerivedForm : Form
{
    public MyDerivedForm()
    {
        InitializeComponent();
    }

    public void ChangeTheme(bool usedarkmode)
    {
        if (usedarkmode)
            ToDarkMode();
        else
            ToLightMode();
    }

    public void ToDarkMode()
    {
        this.BackColor = Color.FromArgb(28, 28, 28);
    }

    public void ToLightMode()
    {
        this.BackColor = Color.FromArgb(241, 241, 241);
    }
}

我简化了您的FromArgb通话。您的所有投射完全多余。

现在从MyDerivedForm导出所有其他形式:

public MainForm : MyDerivedForm
{
}

只需向项目添加一个新表单,然后将: Form更改为: MyDerivedForm

在Settings_form中,您可以循环浏览所有打开的表单,并在每个表单上调用ChangeTheme函数,然后在明暗模式之间进行切换。

public Settings_form: MyDerivedForm
{
    public Settings_form()
    {
        InitializeComponent();
    }

    private void UseDarkMode_chk_CheckedChanged(object sender, EventArgs e)
    {
        //Some code
        SettingsClass.UseDarkMode = this.UseDarkMode_chk.Checked;

        foreach(MyDerivedForm form in Application.OpenForms.OfType<MyDerivedForm>())
        {
            form.ChangeTheme(SettingsClass.UseDarkMode);
        }
    }
}

答案 1 :(得分:0)

我注意到的一个大问题在这里:

public void callChangeTheme()
{
    Settings_form settings_Form = new Settings_form();
    settings_Form.changeTheme += new statusChange(chooseOtherTheme);
}

每次调用此方法时,您都在创建一个Settings_form的新实例,但是您从未真正对该实例执行 操作-唯一一次调用Show()是完全不同的实例:

private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
    Settings_form settings_Form = new Settings_form();
    settings_Form.Show();
}

如果您想从主表单中执行Settings_form,则应确保始终在同一实例上进行操作。

此外,请务必对事件进行订阅和取消订阅,以确保不会意外导致内存泄漏。您可以在这里查看更多详细信息:Why and How to avoid Event Handler memory leaks?