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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

public bool IsClosed { get; private set; }

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

PresentationSource.FromVisual(окно) == null;

Ответ 6

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

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...
     . . .
}

Ответ 7

Вы можете добавить нестатическое свойство в 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;
}

Ответ 8

У меня есть небольшой поворот к этому вопросу...

Разработка формы, которая сохраняет электронную таблицу при действии пользователя "отправить запись". В случае, если электронная таблица уже открыта, откроется диалоговое окно "Сохранить как".

Если пользователь нажимает кнопку отмены в этом окне, есть ли способ обнаружить его?