Существует старый способ сделать это с помощью интерфейса. Я вижу это в Java как способ компенсировать отсутствие делегатов (поправьте меня, если я ошибаюсь). Этот метод позволит вам проверить, есть ли уже открытое окно (любого типа). Исходный ответ работает очень хорошо, но вы также можете сделать это следующим образом:
Создать интерфейс
public interface IWindowTracker
{
void WindowIsOpened();
void WindowIsClosed();
}
Реализация интерфейса на родительском (откуда вы открываете):
public partial class MainWindow : Window, IWindowTracker
В вашем конструкторе примите объект, который имеет интерфейс IwindowTracker. Сохраните экземпляр для будущего использования
IWindowTracker windowTracker;
public ProjectManager(IWindowTracker parentWindowTracker)
{
windowTracker = parentWindowTracker;
InitializeComponent();
}
Настройка вызовов для объекта окна отслеживания
protected override void OnActivated(EventArgs e)
{
windowTracker.WindowIsOpened();
base.OnActivated(e);
}
protected override void OnClosed(EventArgs e)
{
windowTracker.WindowIsClosed();
base.OnClosed(e);
}
и, наконец, реализовать IWindowTracker в родительском окне WPF
bool windowIsOpen = false;
public void WindowIsOpened()
{
windowIsOpen = true;
}
public void WindowIsClosed()
{
windowIsOpen = false;
}
Это позволит вам следить за тем, открыто ли окно и если это так, нет необходимости открывать его новый экземпляр:
if (!windowIsOpen)
{
remoteProjectManager = new ProjectManager(this);
remoteProjectManager.Show();
}
remoteProjectManager.Focus();
Вызов show () для закрытого окна, похоже, вызывает исключение, поэтому я предполагаю, что есть какой-то другой способ или что, если вы закрыли окно, окно технически "уничтожено"
Приятно то, что я могу определить, все ли еще открыто окно, и сфокусироваться на нем (чтобы он снова выходил на передний план).
ПРИМЕЧАНИЕ: есть недостаток в том, что в этой настройке он ограничивает вас открытием только одного окна за раз (при условии, что все ваши окна реализованы таким образом). В моем случае я хочу открыть только одно окно, кроме основного.
Вы также можете проверить, является ли ваше окно пустым или нет, учитывая, что это, вероятно, не единственное окно, которое вам придется открывать.