Ошибка 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 шт):
Вы создаете новое окно в методе 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();
}