Come faccio a sapere se una finestra WPF è aperta

In una finestra WPF, come faccio a sapere se è aperto?

Il mio objective è aprire solo 1 istanza della finestra al momento.

Quindi, il mio pseudo codice nella finestra principale è:

if (this.m_myWindow != null) { if (this.m_myWindow.ISOPENED) return; } this.m_myWindow = new MyWindow(); this.m_myWindow.Show(); 

MODIFICARE:

Ho trovato una soluzione che risolve il mio problema iniziale. window.ShowDialog ();

Blocca l’utente dall’aprire qualsiasi altra finestra, proprio come un popup modale. Utilizzando questo comando, non è necessario verificare se la finestra è già aperta.

In WPF è presente una raccolta di Windows aperte nella class Application , è ansible creare un metodo di supporto per verificare se la finestra è aperta.

Ecco un esempio che controllerà se una Window di un certo Type o se una Window con un certo nome è aperta, o entrambe.

 public static bool IsWindowOpen(string name = "") where T : Window { return string.IsNullOrEmpty(name) ? Application.Current.Windows.OfType().Any() : Application.Current.Windows.OfType().Any(w => w.Name.Equals(name)); } 

Uso:

 if (Helpers.IsWindowOpen("MyWindowName")) { // MyWindowName is open } if (Helpers.IsWindowOpen()) { // There is a MyCustomWindowType window open } if (Helpers.IsWindowOpen("CustomWindowName")) { // There is a MyCustomWindowType window named CustomWindowName open } 

È ansible verificare se m_myWindow==null e solo successivamente creare e mostrare la finestra. Quando la finestra si chiude, impostare la variabile su null.

  if (this.m_myWindow == null) { this.m_myWindow = new MyWindow(); this.m_myWindow.Closed += (sender, args) => this.m_myWindow = null; this.m_myWindow.Show(); } 

Se è necessario triggersre la finestra, se è stata trovata, è ansible utilizzare il seguente codice:

 //activate a window found //T = Window Window wnd = Application.Current.Windows.OfType().Where(w => w.Name.Equals(nome)).FirstOrDefault(); wnd.Activate(); 

Ecco un altro modo per ottenere ciò usando LINQ.

 using System.Linq; ... public static bool IsOpen(this Window window) { return Application.Current.Windows.Cast().Any(x => x == window); } 

Uso:

 bool isOpen = myWindow.IsOpen(); 

Metti un bool statico nella tua class, chiamato _open o qualcosa del genere. Nel costruttore quindi fare questo:

 if (_open) { throw new InvalidOperationException("Window already open"); } _open = true; 

e nell’evento Closed:

 _open = false; 

Stai cercando?

 if (this.m_myWindow != null) { if (this.m_myWindow.IsActive) return; } this.m_myWindow = new MyWindow(); this.m_myWindow.Show(); 

Se vuoi un singleton, dovresti leggere questo: come possiamo creare un’istanza singleton per una finestra?

  void pencereac (int Ops) where T : Window , new() { if (!Application.Current.Windows.OfType().Any()) // Check is Not Open, Open it. { var wind = new T(); switch (Ops) { case 1: wind.ShowDialog(); break; case 0: wind.Show(); break; } } else Application.Current.Windows.OfType().First().Activate(); // Is Open Activate it. } 

Kullanımı:

 void Button_1_Click(object sender, RoutedEventArgs e) { pencereac(1); }