Как узнать, закрыто ли окно WPF? - PullRequest
50 голосов
/ 19 декабря 2008

Я работаю над приложением, которое отображает некоторые дочерние окна, которые могут быть закрыты пользователем или автоматически закрыты. Отлаживая некоторые возникающие исключения, я обнаружил, что пытаюсь вызывать методы типа Hide() в уже закрытом окне; эта конкретная ветвь кода была общей для обоих случаев, и я этого не заметил.

Одна из моих первых идей заключалась в поиске свойства на Window, которое указывало бы на то, что окно было закрыто. Кажется, я не могу его найти. В WinForms я бы посмотрел на свойство IsDisposed , чтобы получить достаточно надежный индикатор того, что форма была закрыта (она не будет надежно работать для диалога, но я не работаю с диалогами.) Не вижу ничего эквивалентного на Window. Документация для Window.Close() не указывает какие-либо свойства, которые были изменены методом. Я что-то упускаю из виду, или это единственный способ узнать, закрыто ли окно для обработки события Closed? Это кажется жестким требованием к простой задаче.

Ответы [ 7 ]

53 голосов
/ 19 декабря 2008

Согласно этой беседе на форумах MSDN WPF (см. Последнее сообщение), вы можете проверить, имеет ли IsLoaded значение false, что означает, что окно «подходит» для выгрузки его содержимого. Я надеюсь, что это работает для вас!

11 голосов
/ 04 апреля 2016

Если вы наследуете класс Window, вы можете сделать это:

public bool IsClosed { get; private set; }

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
    IsClosed = true;
}

Он имеет преимущество перед регистрацией на закрытое событие - нет необходимости отменять регистрацию обратного вызова.

7 голосов
/ 07 декабря 2011

Другой способ: Application.Windows содержит список открытых окон. Вы можете проверить, содержит ли эта коллекция ваше окно (оно удаляется после закрытия).

Похоже, вам нужно позвонить OfType<Window>(), потому что это специализированная коллекция.

5 голосов
/ 24 сентября 2015

Я не знаю, почему свойство IsDisposed является внутренним, но если вы не боитесь отражения:

var window = new Window();
var propertyInfo = typeof(Window).GetProperty("IsDisposed", BindingFlags.NonPublic | BindingFlags.Instance);
var isDisposed = (bool)propertyInfo.GetValue(window);

При этом рефлексия не должна быть чрезмерно использована, потому что вы больше не защищены публичным API класса. Обязательно используйте хотя бы юнит-тесты, если вы идете по этому пути.

4 голосов
/ 16 октября 2015

Мое решение состояло в том, чтобы просто прикрепить событие к Closed событию диалога:

MikesDialog dlg = new MikesDialog();
dlg.Closed += delegate
{
    //  The user has closed our dialog.
    validationgDlg = null;
};

//  ...elsewhere in the code...

if (validationgDlg != null)
{
     //  Our "MikesDialog" is still open...
     . . .
}
4 голосов
/ 14 октября 2014

Надеюсь, это полезно для вас:

PresentationSource.FromVisual (window) == null;

0 голосов
/ 18 января 2018

Вы можете добавить нестатическое свойство в WindowClass bool IsClosed и установить true для события Closed:

public partial class MyWindow : Window
{
    public bool IsClosed { get; set; } = false;
    public MyWindow()
    {
        Closed += MyWindow_Closed;
        InitializeComponent();
    }
}    

private void MyWindow_Closed(object sender, EventArgs e)
{
   IsClosed = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...