Исключение с нулевой ссылкой происходит из-за того, что ничто не подписано на ваше событие.
Обычно вы создаете событие, подобное этому:
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
В форме «Настройки_» вы можете просто зациклить все открытые формы и вызвать функцию 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);
}
}
}