当我有两个非静态表单时,如何在它们之间创建一个事件

MineFuf LP

我这里有两种形式,我想在 c# winform 中从一种形式到另一种形式调用该函数。我使用事件来做到这一点,但它们不起作用。每次我调用 changeTheme () 时,它都会向我抛出 System.NullReferenceException 错误:“未将对象引用设置为对象的实例。”

我试图通过 Main_form 表单的实例给她打电话,但也没有奏效。我也尝试过这些事件,但是当我添加一个函数来使它再次设置为空时。但我想用一个事件来做。

public delegate void statusChange();

public partial class Settings_form : Form
{
    public event statusChange changeTheme;

    //Here is some function, variables declaration and code

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



public partial class Main_form : Form
{

    private void Form1_Load(object sender, EventArgs e)
    {

        callChangeTheme();
    }

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


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

    public void chooseOtherTheme()
    {
        if (SettingsClass.UseDarkMode)
            ToDarkMode();
        else ToLightMode();
    }

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

    public void ToLightMode()
    {
         this.BackColor = Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(241)))), ((int)(((byte)(241)))));
    }
}
手提包蟹

发生空引用异常是因为没有订阅您的事件。

通常你会创建一个这样的事件:

public event EventHandler<EventArgs> MyEvent;

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

并像这样启动它:

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

这样它只会在你有订阅者时触发。再次类似于 if != null fire 旧样式。

有了这个,有一种更简单的方法可以在没有事件的情况下实现你想要的。

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

你的新基本形式:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在JavaScript中匹配两个模式并在它们之间留一个空格?

来自分类Dev

当我设置两个有效对象之间的关系时validateForInsert失败

来自分类Dev

如何获取具有相同值的两个对象,并使它们成为一个对象

来自分类Dev

当它们具有相同的FROM时,一个SELECT语句而不是两个

来自分类Dev

如何创建一个包含两个相同模式之间的所有字符串的列表

来自分类Dev

具有相同元素的两个孩子反应。当我尝试删除任何一个div时,都会删除两个

来自分类Dev

当我告诉节点运行一个文件时,节点运行两个文件

来自分类Dev

我需要在两个等于1的日期之间创建一个虚拟变量

来自分类Dev

如何为一个类创建两个构造函数,两个构造函数都具有字符串,string,但它们的用途不同?

来自分类Dev

当我们释放一个按钮时,如何触发一个事件?

来自分类Dev

Rails嵌套资源,当我在GET请求中需要另一个ID时如何创建两个新资源?

来自分类Dev

如何创建两个相等的列,且两者之间有一个固定空间

来自分类Dev

如何在两个不同的网络之间创建一个子网

来自分类Dev

我有两个水平滚动视图。如何一次显示一个,并在单击按钮时在它们之间切换?

来自分类Dev

两个实体类,它们之间有一个帮助器类

来自分类Dev

我如何在两个xpath之后合并并创建一个xpath

来自分类Dev

当我的html中有两个不同的名称时,如何在数据库中插入数据?

来自分类Dev

当它们具有相同的FROM时,一个SELECT语句而不是两个

来自分类Dev

如何在一个列中的两个值之间取平均值并将该值放在Excel中的它们之间?

来自分类Dev

父分区内有两个div(它们之间有一个空格)

来自分类Dev

当我使用onMouseOver从一个div转到另一个div时,内部有两个div

来自分类Dev

当我有两个 Worker 节点时,为什么 Spark Standalone 只创建一个 Executor?

来自分类Dev

当我打开两个实例时,它没有要求在 Ubuntu 18.04 中选择任何一个

来自分类Dev

当我有一个带有两个 FK 的模型到同一个模型时解决 FK 向后关系

来自分类Dev

django 中的模型,当我在 admin 中编辑一个值时如何更改两个值?

来自分类Dev

我有两个完美运行的脚本,但是当我将它们组合在一起时它不起作用

来自分类Dev

当我将 cin 用于两个输入时,如何接收一个输入?

来自分类Dev

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

来自分类Dev

当我只放一个时,怎么会有两个位置参数?

Related 相关文章

  1. 1

    如何在JavaScript中匹配两个模式并在它们之间留一个空格?

  2. 2

    当我设置两个有效对象之间的关系时validateForInsert失败

  3. 3

    如何获取具有相同值的两个对象,并使它们成为一个对象

  4. 4

    当它们具有相同的FROM时,一个SELECT语句而不是两个

  5. 5

    如何创建一个包含两个相同模式之间的所有字符串的列表

  6. 6

    具有相同元素的两个孩子反应。当我尝试删除任何一个div时,都会删除两个

  7. 7

    当我告诉节点运行一个文件时,节点运行两个文件

  8. 8

    我需要在两个等于1的日期之间创建一个虚拟变量

  9. 9

    如何为一个类创建两个构造函数,两个构造函数都具有字符串,string,但它们的用途不同?

  10. 10

    当我们释放一个按钮时,如何触发一个事件?

  11. 11

    Rails嵌套资源,当我在GET请求中需要另一个ID时如何创建两个新资源?

  12. 12

    如何创建两个相等的列,且两者之间有一个固定空间

  13. 13

    如何在两个不同的网络之间创建一个子网

  14. 14

    我有两个水平滚动视图。如何一次显示一个,并在单击按钮时在它们之间切换?

  15. 15

    两个实体类,它们之间有一个帮助器类

  16. 16

    我如何在两个xpath之后合并并创建一个xpath

  17. 17

    当我的html中有两个不同的名称时,如何在数据库中插入数据?

  18. 18

    当它们具有相同的FROM时,一个SELECT语句而不是两个

  19. 19

    如何在一个列中的两个值之间取平均值并将该值放在Excel中的它们之间?

  20. 20

    父分区内有两个div(它们之间有一个空格)

  21. 21

    当我使用onMouseOver从一个div转到另一个div时,内部有两个div

  22. 22

    当我有两个 Worker 节点时,为什么 Spark Standalone 只创建一个 Executor?

  23. 23

    当我打开两个实例时,它没有要求在 Ubuntu 18.04 中选择任何一个

  24. 24

    当我有一个带有两个 FK 的模型到同一个模型时解决 FK 向后关系

  25. 25

    django 中的模型,当我在 admin 中编辑一个值时如何更改两个值?

  26. 26

    我有两个完美运行的脚本,但是当我将它们组合在一起时它不起作用

  27. 27

    当我将 cin 用于两个输入时,如何接收一个输入?

  28. 28

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

  29. 29

    当我只放一个时,怎么会有两个位置参数?

热门标签

归档