0

Есть такой код:

        MainWindow mainWindow = new MainWindow();
        Grid gridServ = new Grid();
        ServersGrid.Children.Add(gridServ);
    TextBlock serverName = new TextBlock();

    serverName.Text = "name";
    serverName.HorizontalAlignment = HorizontalAlignment.Center;
    serverName.VerticalAlignment = VerticalAlignment.Center;
    serverName.FontFamily = new FontFamily("Segoe UI");
    serverName.FontWeight = FontWeights.Bold;
    serverName.FontSize = 13;


    TextBlock serverDiscription = new TextBlock();
    serverDiscription.Text = "discription";
    serverDiscription.VerticalAlignment = VerticalAlignment.Center;
    serverDiscription.HorizontalAlignment = HorizontalAlignment.Left;
    serverDiscription.Margin = new Thickness(5, 0, 0, 0);



    Button button = new Button();

    button.Width = 80;
    button.Height = size;
    button.FontFamily = new FontFamily("Segoe UI");
    button.FontWeight = FontWeights.Bold;
    button.FontSize = 15;
    button.Content = "Играть";




    Style buttonStyle = new Style();

    buttonStyle.Setters.Add(new Setter { Property = Control.FontFamilyProperty, Value = new FontFamily("Verdana") });
    buttonStyle.Setters.Add(new Setter { Property = Control.BackgroundProperty, Value = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFE82F2F")) });
    buttonStyle.Setters.Add(new Setter { Property = Control.ForegroundProperty, Value = new SolidColorBrush(Colors.White) });
    buttonStyle.Setters.Add(new EventSetter { Event = Button.ClickEvent, Handler = new RoutedEventHandler(mainWindow.Button_Click) });
    buttonStyle.Setters.Add(new Setter { Property = Control.HorizontalAlignmentProperty, Value = HorizontalAlignment.Right });
    buttonStyle.Setters.Add(new Setter { Property = Control.VerticalAlignmentProperty, Value = VerticalAlignment.Top });
    buttonStyle.Setters.Add(new Setter { Property = Control.BorderThicknessProperty, Value = new Thickness(0) });
    button.Style = buttonStyle;


    Grid canvasBackground = new Grid();
    canvasBackground.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFFFFFFF"));
    canvasBackground.Height = size;
    canvasBackground.Width = 792;
    canvasBackground.HorizontalAlignment = HorizontalAlignment.Left;
    canvasBackground.VerticalAlignment = VerticalAlignment.Top;
    canvasBackground.Margin = new Thickness(0, margin, 0, 0);


    Grid canvasName = new Grid();
    canvasName.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFFFC453"));
    canvasName.Height = size;
    canvasName.Width = 120;
    canvasName.HorizontalAlignment = HorizontalAlignment.Left;
    canvasName.VerticalAlignment = VerticalAlignment.Center;


    Grid canvasDiscription = new Grid();
    canvasDiscription.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFFFFFFF"));
    canvasDiscription.Height = size;
    canvasDiscription.Width = 535;
    canvasDiscription.HorizontalAlignment = HorizontalAlignment.Center;
    canvasDiscription.VerticalAlignment = VerticalAlignment.Center;



    canvasName.Children.Add(serverName);
    canvasDiscription.Children.Add(serverDiscription);
    canvasBackground.Children.Add(canvasName);
    canvasBackground.Children.Add(canvasDiscription);
    canvasBackground.Children.Add(button);
    gridServ.Children.Add(canvasBackground);

Он рисует вот такую плашку на лаунчере (Название, описание, кнопка играть)

введите сюда описание изображения

И мне нужно чтобы эти плашки появлялись при вызове метода в основном конструкторе, но они не появляются. Появляются только если нажать на тестовую кнопку button (см скрин)

Резюмирую. Так работает

     private void Button_Click_1(object sender, RoutedEventArgs e)
{

    Test();

}

А так не работает:

 public MainWindow()
    {
        InitializeComponent();
    Test(); // отсюда не работает

    RunList();
}

Говорит эксепшн стаковерфлоу

  • Скажите, а зачем вам WPF, если вы не используете его основные возможности? В нем очень плохо работать с контролами (особенно создавать их) через код! – EvgeniyZ Oct 21 '21 at 15:23
  • У меня все на XAML, кроме этой плашки. Мне нужно отрисовать эту плашку 10 раз через цикл вставляя в нее данные которые я получаю по API. Я же не могу сделать цикл в XAML )) – Александр Кучеров Oct 21 '21 at 15:28
  • Пишите разметку в XAML. А не работает наверное потому что вы какое-то mainwindow coздаете в конструкторе mainwindow, конструктор которого создает mainwindow, где в конструкторе создается mainwindow, и снова вгутри создается mainwindow... и так далее до бесконечности. Если бы вы научились пользоваться отладчиком, ставить точки останова и выполнять код пошагово,этот вопрос бы не возник. – aepot Oct 21 '21 at 15:28
  • Я же не могу сделать цикл в XAML - кто вам такое сказал? ItemsControl в помощь. А сейчас вы делаете бред. – EvgeniyZ Oct 21 '21 at 15:29
  • 1
    Спасибо, вы меня направили. Пойду узнаю что такое коллекции и itemscontrol – Александр Кучеров Oct 21 '21 at 15:32

1 Answers1

0

У вас бесконечная рекурсия.

уберите эту строчку

MainWindow mainWindow = new MainWindow();

А вот эту строчку

buttonStyle.Setters.Add(new EventSetter { Event = Button.ClickEvent, Handler = new RoutedEventHandler(mainWindow.Button_Click) });

Измените вот так

buttonStyle.Setters.Add(new EventSetter { Event = Button.ClickEvent, Handler = new RoutedEventHandler(this.Button_Click) });

Потому что не нужно создавать новое окно, а вместо этого обращаться к текущему.

Но вообще лучше из вместо этой каши наверстать разметку в XAML используя ItemsControl с привязкой к коллекции. Вот примеры, особенно обратите внимание на этот, он содержит практически всё, что вам нужно.

aepot
  • 49,560
  • 1
    Черт возьми! Огромное вам спасибо! Вы просто человек бог! Здоровья вам побольше, я потратил на это несколько недель. Но теперь я отлично понимаю, что мне нужно выучить и куда копать, еще раз огромнейшее спасибо! – Александр Кучеров Oct 21 '21 at 16:01