Попытка вызвать функцию из другой формы, но это не сработает

Так что я новичок в программировании и особенно в C #, поэтому надеюсь, что вы мне поможете. У меня есть две формы WPF, и когда я нажимаю кнопку в одной из них, я хочу нарисовать сетку на своем холсте. Поэтому, когда я нажимаю кнопку, она вызывает нужную функцию и все такое, но сетка просто не отображается. Я пытался найти людей с похожими проблемами, но не мог понять, что не так. Вот часть моего кода:

namespace GameOfLife
{
  public partial class SetupPopUp : Window
  {
    public SetupPopUp()
    {
      InitializeComponent();
    }

    private void OkButton_Click(object sender, RoutedEventArgs e)
    {
      int cols;
      int rows;

      int.TryParse(tb_numCol.Text, out cols);
      int.TryParse(tb_numRows.Text, out rows);
      this.Close();
      MainWindow.Instance.DrawGrid(rows,cols);
    }
  }
}

а также:

namespace GameOfLife
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    private static MainWindow _instance;

    public static MainWindow Instance
    {
      get
      {
        return _instance = _instance ?? new MainWindow();
      }
    }

    public void DrawGrid(int rows, int cols)
    {
      for (int i = 0; i < rows; i++)
      {
        for (int j = 0; j < cols; j++)
        {
          Rectangle r = new Rectangle();                  // Erstellt die Rechtecke und fügt Sie dem Canvas hinzu
          r.Width =  MainCanvas.Width / rows;
          r.Height = MainCanvas.Height / cols;
          r.Fill = Brushes.WhiteSmoke;
          r.Stroke = Brushes.Black;
          r.StrokeThickness = 0.5;
          MainCanvas.Children.Add(r);

          Canvas.SetLeft(r, j * r.Width);                 //Reit die Rechtecke aneinander
          Canvas.SetTop(r, i * r.Height);

          r.MouseDown += R_MouseDown;
        }
      }
    }

person Tantem    schedule 16.09.2018    source источник


Ответы (2)


Помимо того, что упомянул @mrid, ваша реализация синглтона может работать не совсем правильно. Возможно, обратитесь к здесь о том, как сделать MainWindow одноэлементным.

Изменить:

Как упоминал @Tantem в комментариях, проблему синглтона также можно легко избежать, вызвав:

((MainWindow)Application.Current.MainWindow).DrawGrid(rows,cols);
person alxnull    schedule 16.09.2018
comment
Большое спасибо, я уже подозревал это, но не мог понять, потому что я новичок, теперь я просто позвонил ему с помощью: ((MainWindow) Application.Current.MainWindow) .DrawGrid (rows, cols), и теперь он отлично работает - person Tantem; 16.09.2018
comment
@TaW ты прав. Поскольку связанное решение уже подробно описано там, я добавил решение, которое, наконец, выбрал спрашивающий. - person alxnull; 16.09.2018

Ваш this.Close() закрывает вашу форму SetupPopUp перед вызовом MainWindow.Instance.DrawGrid(rows,cols)

person mrid    schedule 16.09.2018
comment
Я тоже думал об этом, но, к сожалению, не в этом проблема. В любом случае спасибо :) - person Tantem; 16.09.2018
comment
Пожалуйста. Но вы уверены, что проблема не в этом? Будет ли вызов DrawGrid во втором окне? - person mrid; 16.09.2018
comment
Я проверил это еще раз, когда вы прокомментировали, но нет. При отладке вы можете увидеть, как программа выполняет итерацию через функцию DrawGrid (), но безрезультатно. - person Tantem; 16.09.2018