c# ventanas ¿Cómo puedo saber si una ventana WPF está abierta?



wpf vs windows forms (6)

En una ventana de WPF, ¿cómo puedo saber si está abierta?

Mi objetivo es abrir solo 1 instancia de la ventana en ese momento.

Entonces, mi pseudo código en la ventana principal es:

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

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

EDITAR:

Encontré una solución que resuelve mi problema inicial. window.ShowDialog ();

Bloquea al usuario para que no abra ninguna otra ventana, al igual que una ventana emergente modal. Usando este comando, no es necesario verificar si la ventana ya está abierta.



Puede verificar si m_myWindow==null y solo crear y mostrar la ventana. Cuando se cierra la ventana, establezca la variable nuevamente en nulo.

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

using System.Linq;

...

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

Kullanımı:

bool isOpen = myWindow.IsOpen();

Ponga un bool estático en su clase, llamado _open o algo así. En el constructor entonces haz esto:

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

y en el evento Cerrado:

_open = false;

En WPF hay una colección de Windows abierta en la clase de Application , podría hacer un método auxiliar para verificar si la ventana está abierta.

Aquí hay un ejemplo que verificará si alguna Window de un Type determinado o si una Window con un nombre determinado está abierta, o ambos.

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

Uso:

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
}

Si necesita activar la ventana si la encuentra, puede usar el siguiente código:

//activate a window found
//T = Window

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




window