web-dev-qa-db-fra.com

Comment savoir si une fenêtre WPF est ouverte

Dans une fenêtre WPF, comment savoir si elle est ouverte?

Mon objectif est d'ouvrir une seule instance de la fenêtre à la fois.

Donc, mon pseudo-code dans la fenêtre parent est:

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

this.m_myWindow = new MyWindow();
this.m_myWindow.Show();

MODIFIER:

J'ai trouvé une solution qui résout mon problème initial . window.ShowDialog ();

Il empêche l'utilisateur d'ouvrir n'importe quelle autre fenêtre, à la manière d'une fenêtre contextuelle modale . Cette commande permet de vérifier si la fenêtre est déjà ouverte.

30
guilhermecgs

Dans WPF, il existe une collection de Windows ouvert dans la classe Application, vous pouvez créer une méthode d'assistance pour vérifier si la fenêtre est ouverte.

Voici un exemple qui vérifiera si une Window d'une certaine Type ou si une Window portant un certain nom est ouverte, ou les deux.

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

Usage:

if (Helpers.IsWindowOpen<Window>("MyWindowName"))
{
   // MyWindowName is open
}

if (Helpers.IsWindowOpen<MyCustomWindowType>())
{
    // There is a MyCustomWindowType window open
}

if (Helpers.IsWindowOpen<MyCustomWindowType>("CustomWindowName"))
{
    // There is a MyCustomWindowType window named CustomWindowName open
}
69
sa_ddam213

Vous pouvez vérifier si m_myWindow==null et seulement ensuite créer et afficher une fenêtre. Lorsque la fenêtre se ferme, définissez la variable sur 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();
    }
9
jure

Voici un autre moyen de réaliser cela avec LINQ.

using System.Linq;

...

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

Usage:

bool isOpen = myWindow.IsOpen();
4
Mike Eason

Si vous devez activer la fenêtre si elle est trouvée, vous pouvez utiliser le code ci-dessous:

//activate a window found
//T = Window

 Window wnd = Application.Current.Windows.OfType<T>().Where(w => w.Name.Equals(nome)).FirstOrDefault();
 wnd.Activate();
2
Mauricio Ferraz

Mettez une classe statique dans votre classe, nommée _open ou quelque chose du genre. Dans le constructeur, procédez comme suit:

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

et dans l'événement fermé:

_open = false;
1
It'sNotALie.
    void  pencereac<T> (int Ops) where T : Window , new()
    {
        if (!Application.Current.Windows.OfType<T>().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<T>().First().Activate(); // Is Open Activate it.
    }

Kullanımı:

void Button_1_Click(object sender, RoutedEventArgs e)
{
  pencereac<YourWindow>(1);
}
0

Est-ce que vous cherchez?

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

this.m_myWindow = new MyWindow();
this.m_myWindow.Show();

Si vous voulez un singleton, vous devriez lire ceci: Comment pouvons-nous créer une instance de singleton pour une fenêtre?

0
Floc