我在这里有两种形式,我想在c#winform中从一个函数调用另一个函数。我使用事件来执行此操作,但是它们不起作用。每次调用changeTheme()时,都会引发System.NullReferenceException错误:“对象引用未设置为对象的实例。”
我试图通过Main_form表单的实例给她打电话,但是它也不起作用。我也尝试了这些事件,但是当我添加一个函数来使其创建时,再次将其设置为null。但我想通过一个事件来完成它。
SDL2pp/SDL2pp.hh: No such file or directory
答案 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?