Ошибка System.StackOverflowException при попытке изменить элемент окна через другой класс C# WPF

В проекте WPF помимо окна (MainWindow) я добавил класс Class2. Через класс Class2 я пытаюсь изменить свойство Background (тобишь фон) элемента MyPanel на чёрный, путём вызова метода ChangeBackgroundToBlack(), в котором я создаю объект на основе класса MainWindow чтобы обратиться к элементам окна. Также я создал новый объект класса Class2 и через него пытаюсь вызвать метод ChangeBackgroundToBlack(), но при запуске такого кода компилятор выводит ошибку System.StackOverflowException. Что делать? (через static не пойдёт)

MainWindow.xaml.cs

namespace TESTSMTH_WPF
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent(); //эта строчка кода вызывает ошибку
            Class2 m = new Class2();
            m.ChangeBackgroundToBlack();
        }
    }
}

MainWindow.xaml

<Window x:Class="TESTSMTH_WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TESTSMTH_WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid x:Name="MyPanel">
        
    </Grid>
</Window>

Class2.cs

namespace TESTSMTH_WPF
{
    internal class Class2
    {
        public int day;
        
        public void ChangeBackgroundToBlack()
        {
            MainWindow w = new MainWindow();
            w.MyPanel.Background = Brushes.Black;
        }
        
      
    }
}

Ответы (1 шт):

Автор решения: aepot

Вы создаете новое окно в методе ChangeBackgroundToBlack, а надо наверное существующее использовать.

public void ChangeBackgroundToBlack(MainWindow w)
{
    w.MyPanel.Background = Brushes.Black;
}
public MainWindow()
{
    InitializeComponent();
    Class2 m = new Class2();
    m.ChangeBackgroundToBlack(this);
}

Переполнение стека происходит от того, что окно вызывает ChangeBackgroundToBlack, ChangeBackgroundToBlack создает окно, новое окно вызывает ChangeBackgroundToBlack, ChangeBackgroundToBlack создает ещё окно и так далее до возникновения исключения StackOverflowException.


Второй вариант

internal class Class2
{
    public int day;
    private readonly MainWindow _w;

    public Class2(MainWindow w)
    {
        _w = w;
    }
        
    public void ChangeBackgroundToBlack()
    {
        _w.MyPanel.Background = Brushes.Black;
    }
}
public MainWindow()
{
    InitializeComponent();
    Class2 m = new Class2(this);
    m.ChangeBackgroundToBlack();
}
→ Ссылка