abdou_31 Ответов: 2

Как я могу проверить, закрыто ли окно ( приложение WPF ) из другой формы?


Здравствуйте , я уже работаю над приложением WPF и хотел бы знать, как я могу проверить, закрыто ли окно или нет с помощью ( X ) из другой формы окна.

Например , у меня есть две формы
первая форма содержит только кнопку , поэтому, когда я нажимаю на кнопку, она показывает вторую форму, и я должен видеть в выводе ( используя `Console.writeline(form2.isclosed())` сообщение, которое показывает False , когда я закрываю вторую форму, на выходе должно отображаться сообщение True ( означает, что форма 2 была закрыта ) .

Консоль для двоих.writeline()` должен быть в первой форме, а не во второй ,
Как я могу это сделать?


// Window form 1
           
            for (int k = 0; k <= listgrid.Count - 1; k++)
            {
                test  test = new test(listgrid[0]); // the new form ( Window form 2 )
                test.Show();
                if (test.IsClosed) // I need to check here if the window form 2 is closed or not
                {
                    Console.WriteLine("OKK Is closed after  " + test.IsClosed);
                    test.Show();
                }

            }



// Second form
  public partial class test : Window
    {
        public bool test_close;

        public test(GridModel gridModel)
        {
            InitializeComponent();           
 
        }

        private void Window_Closed(object sender, EventArgs e)
        {
        //      base.Close();
            IsClosed = true;
            Console.WriteLine( " Ok " +IsClosed);
        }
        public bool IsClosed { get; private set; }

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            IsClosed = true;
        }



Что я уже пробовал:

Я попытался просто показать вторую форму с помощью кнопки в первой форме.

2 Ответов

Рейтинг:
2

OriginalGriff

Самым простым решением будет справиться и со второй форм закрытом мероприятии в первый: при создании экземпляра формы Form2, нужно добавить свой обработчик событий beofe ре показать на форме, и ваш обработчик будет выполняться при форме Form2 закрывается.

Это довольно просто сделать: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^] показывает основы использования пользовательского события - но закрытое событие все равно является частью формы, как в WPF, так и в WinForms.


abdou_31

Спасибо , но я могу передать параметры только из формы 1 во вторую форму , а не наоборот , потому что у меня нет ( `new form1().show()` во второй форме ) мне нужно просто получить результат события ( true или false ) из второй формы и распечатать его в форме 1, я говорю `консоль.writeline()` ( print ) просто чтобы получить его для теста, они мне понадобятся позже в другой работе.

OriginalGriff

В этом нет необходимости.
Это событие обрабатывается не-закрытой формы (form1, которая отображает Из2, чтобы начать с) автоматически, когда формы Form2 закрывается. Закрытый экземпляр Form2 передается обработчику событий через параметр "отправитель", что позволяет вашему коду Form1 по своему желанию обращаться к его свойствам.

Рейтинг:
1

Afzaal Ahmad Zeeshan

1. Почему вы используете консоль.WriteLine в приложении на основе графического интерфейса?
2. я думаю, что было бы лучше использовать события в C# и делегировать уведомление родительской форме, а не жестко кодировать/глазеть на форму, которая будет закрыта до того, как вы продолжите работу в коде C#.

Обработка и повышение уровня событий | Microsoft Docs[^]\

Таким образом, вы можете вызвать событие в родительской форме, что форма закрывается, и родительская форма будет "знать", что форма закрыта, так что вы можете продолжить оттуда. Пожалуйста, ознакомьтесь с документацией, чтобы узнать больше об этом.

Немного грязный подход будет заключаться в том, чтобы передать экземпляр родительской формы в конструктор тестовой формы и непосредственно перед закрытием вызвать метод в родительской форме, чтобы уведомить, что форма закрыта.

WindowForm1 form1;
public test(GridModel gridModel, WindowForm1 parent)
{
    InitializeComponent();

    this.form1 = parent;
}

// later
private void Window_Closed(object sender, EventArgs e)
{
    // base.Close();
    IsClosed = true;
    Console.WriteLine( " Ok " +IsClosed);
    form1.FormClosed(this);
}
Чтобы это сработало, примите метод в WindowForm1 для продолжения работы;
public void FormClosed(test form) {
   // your logic here
}

Я повторяю, это грязный подход; что еще хуже, если вы вызываете метод таким образом, ваша вторичная форма еще не закрыта (вызов метода не вернулся), поэтому вы будете неверны в своей логике; Я прошу прощения. :вздыхать:


Afzaal Ahmad Zeeshan

Простое было бы некрасиво; я снова предупреждаю, так как это будет содержать много плохих практик, неопределенных ветвей, квантовых флуктуаций (ладно, я солгал с этим! ;-)...), но вы понимаете, в чем дело.

Изучение событий в C# - это лучший выбор для вас здесь. Но я поделился примером кода, который дал бы более простой способ сделать это.

Примечание: Из вашего кода я предполагаю, что вы хотите открыть test форма после текущей test форма закрылась. Что будет возможно с событиями более легко.

abdou_31

Я хотел бы открыть тестовую форму ( вторую форму), когда я нажимаю на кнопку, которая существует в первой форме.
После этого я хотел бы , когда я нажимаю на (X) второй формы ( тестовая форма), я хотел бы сделать что-то в первой форме, я сказал в качестве примера просто print(консоль.writeline(Window.isClosed)) должен возвращать true или false . Это то, что мне нужно.

Afzaal Ahmad Zeeshan

И я уже говорил вам, что легче справиться с этой логикой с событиями, чтобы ваши формы уведомляли друг друга о состояниях и обновлениях.