@nuraGGupta@ Ответов: 7

Откройте окно и закройте все остальные в WPF


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

private void btnOEP_Click(object sender, RoutedEventArgs e)
        {
           ExistingProject objEP = new ExistingProject();
             CloseAllWindows();
             objEP.ShowDialog(); 
        }

        private void btnCNP_Click(object sender, RoutedEventArgs e)
        {
            AddNewProjects objAddNew = new AddNewProjects();
            CloseAllWindows();
            objAddNew.ShowDialog();
           
        }

private void CloseAllWindows()
       {
           for (int intCounter = App.Current.Windows.Count - 1; intCounter >= 0; intCounter--)
               App.Current.Windows[intCounter].Close();
       }



Проблема, с которой я сталкиваюсь, заключается в том, что я открываю диалог формы, а после этого закрываю все окна формы приложения(используя этот код), что, в свою очередь, также закроет требуемое окно. Мне нужно закрыть все формы, кроме той, которую я дал команду оставить открытой. Как это можно сделать? Пожалуйста, предложите решение.

Спасибо

Henry Minute

Как я уже говорил, Вы не можете закрыть основную форму, потому что это приведет к закрытию приложения. Всегда есть система.Окно.Hide (), который скроет главное окно, но затем вам придется передать ссылку на главное окно каждому новому окну, которое вы создадите, обработать событие OnClosing() этого нового окна, чтобы снова показать() главное окно, чтобы дать доступ к кнопкам, готовым к следующему разу.

7 Ответов

Рейтинг:
55

Henry Minute

Я только что создал тестовый проект, используя ваш код.

С парой модов это работает для меня.

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

Так что, имея это в виду, это работает для меня:

private void btnOEP_Click(object sender, RoutedEventArgs e)
{
  CloseAllWindows();
  ExistingProject objEP = new ExistingProject();
  objEP.Show();
}

private void btnCNP_Click(object sender, RoutedEventArgs e)
{
  CloseAllWindows();
  AddNewProjects objAddNew = new AddNewProjects();
  objAddNew.Show();
}

private void CloseAllWindows()
{
  for (int intCounter = App.Current.Windows.Count - 1; intCounter > 0; intCounter--)
      App.Current.Windows[intCounter].Close();
}


@nuraGGupta@

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

Рейтинг:
37

@nuraGGupta@

Я не могу перепроверить это, потому что в настоящее время я нахожусь дома, и у меня нет VS, установленного на моей машине.

NewWindow objNew = new NewWindow(); //Create an object of the window you want to open
CloseAllWindows(); //close all other windows
objNew.ShowDialog(); //Now use the ShowDialog command, and I guess it will work fine as the object reference has been created in the memory.


Предоставьте свою обратную связь, если она не идет правильно.


Анурага


Рейтинг:
2

Henry Minute

ОК.

Вот в чем, по-моему, проблема.

То App.Current.Windows коллекция содержит все окна для вашего приложения, включая его главное окно, которое должно быть App.Current.Windows[0].

Поэтому, если вы закрываете каждое окно в коллекции, вы закрываете главное окно. Когда главное окно закрывается, оно закрывает приложение.

Так Что Я думать это если вы измените свой код на любой из них:

private void CloseAllWindows()
{
    for (int intCounter = App.Current.Windows.Count - 1; intCounter > 0; intCounter--)
        App.Current.Windows[intCounter].Close();
}


или:
private void CloseAllWindows()
{
    for (int intCounter = App.Current.Windows.Count - 1; intCounter >= 1; intCounter--)
        App.Current.Windows[intCounter].Close();
}


тогда это должно сработать.

Надеюсь, это поможет. :)


@nuraGGupta@

извините, но он все еще показывает то же самое исключение :
Система.Исключение InvalidOperationException:
"Невозможно установить видимость или вызвать Show или ShowDialog после закрытия окна."

Рейтинг:
1

Member 9500974

public void CloseAllWindows()
       {
           for (int intCounter = App.Current.Windows.Count - 1; intCounter >= 0; intCounter--)
               App.Current.Windows[intCounter].Hide();
       }


alvinchesaro

Спасибо! Это сработало для меня

Рейтинг:
1

Member 11957617

Login login = App.Current.Windows.OfType<Login>().FirstOrDefault();
           if(login != null)
           {
               login.Close();
           }


Рейтинг:
1

Member 11957617

Ты можешь это сделать :

Login login = App.Current.Windows.OfType<Login>().FirstOrDefault();
           if(login != null)
           {
               login.Close();
           }


Рейтинг:
0

naimish3524

попробуй это сделать..
Окно win = приложение.Текущий.Окна.OfType().SingleOrDefault(w => w.Name == "имя окна");
выиграть.Рядом();