Как узнать, открывается ли окно 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();
Он блокирует открытие пользователем любого другого окна, как модальное всплывающее окно.
Используя эту команду, нет необходимости проверять, открыто ли окно.
Ответы
Ответ 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
}