c# - ventanas - wpf vs windows forms




¿Cómo puedo saber si una ventana WPF está abierta? (5)

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.



Aquí hay otra forma de lograr esto usando LINQ.

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

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

Uso:

    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.
    }

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;

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




window