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); }