Подтвердить что ты не робот

Как узнать, открывается ли окно WPF

В окне WPF, как узнать, открыта ли она?

Моя цель открыть только 1 экземпляр окна в то время.

Итак, мой псевдо-код в родительском окне:

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

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

EDIT:

Я нашел решение, которое решает мою первоначальную проблему. window.ShowDialog();

Он блокирует открытие пользователем любого другого окна, как модальное всплывающее окно. Используя эту команду, нет необходимости проверять, открыто ли окно.

4b9b3361

Ответ 1

В WPF имеется набор открытых Windows в классе Application, вы можете создать вспомогательный метод, чтобы проверить, открыто ли окно.

Вот пример, который будет проверять, существует ли какой-либо Window для определенного Type, или если a Window с определенным именем или оба.

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

Использование:

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
}

Ответ 2

Вы можете проверить, есть ли m_myWindow==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();
    }

Ответ 3

Вот еще один способ добиться этого с помощью LINQ.

using System.Linq;

...

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

Использование:

bool isOpen = myWindow.IsOpen();

Ответ 4

Если вам нужно активировать окно, если оно найдено, вы можете использовать следующий код:

//activate a window found
//T = Window

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

Ответ 5

Поместите статический bool в свой класс с именем _open или что-то в этом роде. В конструкторе сделайте следующее:

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

и в закрытом событии:

_open = false;

Ответ 6

Это вы ищете?

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

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

Если вам нужен синглтон, вы должны прочитать следующее: Как создать экземпляр Singleton для окна?

Ответ 7

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

Ответ 8

window = new MyWindow();
//window.Show();
//window.Close();


if(window != null)
{
   //do stuff if window is open
}
else
{
   //do stuff if window is not open
}