it-swarm.com.de

Woher weiß ich, ob ein WPF-Fenster geöffnet ist?

Woher weiß ich in einem WPF-Fenster, ob es geöffnet ist?

Mein Ziel, zu diesem Zeitpunkt nur 1 Instanz des Fensters zu öffnen.

Mein Pseudo-Code im übergeordneten Fenster lautet also:

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

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

BEARBEITEN:

Ich habe eine Lösung gefunden, die mein ursprüngliches Problem löst . Window.ShowDialog ();

Es hindert den Benutzer daran, ein beliebiges anderes Fenster zu öffnen, genau wie ein modales Popup ..__ Mit diesem Befehl muss nicht geprüft werden, ob das Fenster bereits geöffnet ist.

30
guilhermecgs

In WPF gibt es eine Auflistung der offenen Windows in der Application-Klasse. Sie können eine Hilfsmethode erstellen, um zu überprüfen, ob das Fenster geöffnet ist.

Hier ein Beispiel, in dem geprüft wird, ob eine Window einer bestimmten Type oder ob eine Window mit einem bestimmten Namen oder beide geöffnet sind.

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

Verwendungszweck:

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

Sie können prüfen, ob m_myWindow==null und erst dann ein Fenster erstellen und anzeigen. Wenn das Fenster geschlossen wird, setzen Sie die Variable auf null zurück.

    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

Hier ist eine andere Möglichkeit, dies mit LINQ zu erreichen.

using System.Linq;

...

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

Verwendungszweck:

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

Wenn Sie das Fenster aktivieren müssen, falls es gefunden wurde, können Sie den folgenden Code verwenden:

//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

Fügen Sie in Ihrer Klasse einen statischen Bool mit dem Namen _open oder ähnliches ein. Führen Sie im Konstruktor dann Folgendes aus:

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

und in der Closed Veranstaltung:

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

Suchst du das?

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

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

Wenn Sie ein Singleton benötigen, sollten Sie Folgendes lesen: Wie können wir eine Singleton-Instanz für ein Fenster erstellen?

0
Floc