Как всегда, тут есть простой и правильный способ решения проблемы
Простой метод - просто вызвать метод этого окна. Вы же где-то его отображаете, так ведь? Заведите поле с типом вашего окна с методом, там, где показываете окно - сохраните его туда. Меняете чекбокс - обращаетесь к полю, вызываете метод. Примерно так (код не запускал, где-то может быть нужно немножко иначе написать):
public class MainWindow : Window
{
private WindowWithMetod _windowWithMetod;
// ........................................................................................
private void DisplaySecondWindow()
{
_windowWithMethod = new WindowWithMethod;
_windowWithMethod.Closed += (s, e) => _windowWithMethod = null;
_windowWithMethod.Show();
}
private void HandleCheckboxValueChanged(object sender, EventArgs args)
{
_windowWithMethod?.Method();
}
}
Правильный метод - подумать, перед тем, как что-то писать. Смотрите, у вас есть какое-то состояние чего-то, выражаемое чекбоксом, это значит, что имеет смысл держать это что-то отдельно от обоих форм. Нам нужно:
- Задавать и хранить какое-то булево значение
- Иметь возможность реагировать на его изменение
Определим интерфейсы, с которыми нам было бы удобно иметь дело (имена лучше дать более осмысленные):
public interface IBooleanState
{
public bool State { get; set; }
}
public interface IBooleanStateEvents
{
public event EventArgs<bool> StateChanged;
}
Если у вас нет generic-версии EventArgs, возьмите эту:
public sealed class EventArgs<T> : EventArgs
{
public EventArgs(T value)
{
Value = value;
}
public T Value { get; }
}
Далее, реализуем наши интерфейсы, удобнее будет сделать это в одном классе:
public sealed class BooleanState : IBooleanState, IBooleanStateEvents
{
private bool _state;
public event EventArgs<bool> StateChanged;
public bool State
{
get => _state;
set
{
if (value == _state)
{
return;
}
_state = value;
StateChanged?.Invoke(this, new EventArgs(value));
}
}
}
Далее, нам нужно как-то получить доступ ко всему этому добру из наших форм. Меняем конструкторы и добавляем поля:
public class MainWindow : Window
{
private readonly IBooleanState _state;
// ..................
public MainWindow(IBooleanState state)
{
_state = state;
}
}
public class WindowWithMethod : Window
{
private readonly _stateEvents;
public WindowWithMethod(IBooleanStateEvents stateEvents)
{
_stateEvents = stateEvents;
}
}
Когда создаём окна, передаём туда экземпляр нашего BooleanState:
// Наверное где-то в Program.cs
private readonly BooleanState _state = new BooleanState();
//................................................
Application.Run(new MainWindow(_state));
//................................................
Для второго окна всё зависит от того, где вы его создаёте, если тоже из Program то и передаёте так же, если из MainWindow - придётся кастить:
new WindowWithMethod((IBooleanStateEvents)_state);
Теперь дело осталось за малым, нужно поменять значение из MainWindow, и отреагировать на него в WindowWithMethod:
public class MainWindow : Window
{
private void HandleCheckboxValueChanged(object sender, EventArgs args)
{
_state.State = _checkBox.Checked;
}
}
public class WindowWithMethod : Window
{
// .................
public WindowWithMethod(IBooleanStateEvents stateEvents)
{
// ........................
_stateEvents = stateEvents;
_stateEvents.StateChanged += HandleStateChanged;
// .........................
}
private void HandleStateChanged(object sender, EventArgs<bool> args)
{
Method(args.State);
}
}
Так вам не придётся торчать наружу публичным методом из второго окна, и появится гораздо больше возможностей для дальнейших изменений. Если лениво - интерфейсы можно не определять и использовать только класс.