Ответ 1
В соответствии с этот разговор на форумах MSDN WPF (см. последнее сообщение), вы можете проверить, является ли IsLoaded ложным, что означает, что окно "имеет право" для разгрузки его содержимого. Я надеюсь, что это сработает для вас!
Я работаю над приложением, которое отображает некоторые дочерние окна, которые могут быть закрыты пользователем или автоматически закрыты. При отладке некоторых исключений, которые были брошены, я обнаружил, что пытался вызвать такие методы, как Hide()
, в уже закрытом окне; эта конкретная ветвь кода была общей для обоих случаев, и я этого не заметил.
Одна из моих первых идей заключалась в том, чтобы искать свойство на Window
, которое указывало бы, что окно было закрыто. Кажется, я не могу найти его. В WinForms я бы посмотрел на свойство IsDisposed для несколько надежного индикатора, что форма была закрыта (она не будет надежно работать для диалога, но я не работаю с диалоговыми окнами.) Я не вижу ничего эквивалентного по Window
. Документация для Window.Close()
, как представляется, не указывает никаких свойств, которые были изменены методом. Я пропустил что-то очевидное или это единственный способ узнать, закрыто ли окно для обработки события Closed
? Это кажется суровым требованием для простой задачи.
В соответствии с этот разговор на форумах MSDN WPF (см. последнее сообщение), вы можете проверить, является ли IsLoaded ложным, что означает, что окно "имеет право" для разгрузки его содержимого. Я надеюсь, что это сработает для вас!
Если вы выходите из класса Window, вы можете сделать это:
public bool IsClosed { get; private set; }
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
IsClosed = true;
}
У этого есть преимущество перед регистрацией для Закрытого события - нет необходимости деинсталлировать обратный вызов.
Другой способ: Application.Windows содержит список открытых окон. Вы можете проверить, содержит ли это собрание ваше окно (оно удаляется после закрытия).
Похоже, вам нужно позвонить OfType<Window>()
, потому что это специализированная коллекция.
Я не знаю, почему свойство IsDisposed является внутренним, но если вы не боитесь отражения:
var window = new Window();
var propertyInfo = typeof(Window).GetProperty("IsDisposed", BindingFlags.NonPublic | BindingFlags.Instance);
var isDisposed = (bool)propertyInfo.GetValue(window);
Говоря об этом, размышление не следует злоупотреблять, потому что вы больше не защищены публичным API класса. Обязательно используйте, по крайней мере, единичные тесты, если вы идете по этому маршруту.
Надеюсь, это полезно для вас:
PresentationSource.FromVisual(окно) == null;
Мое решение состояло в том, чтобы просто прикрепить событие к диалогу 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...
. . .
}
Вы можете добавить нестатическое свойство в 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;
}
У меня есть небольшой поворот к этому вопросу...
Разработка формы, которая сохраняет электронную таблицу при действии пользователя "отправить запись". В случае, если электронная таблица уже открыта, откроется диалоговое окно "Сохранить как".
Если пользователь нажимает кнопку отмены в этом окне, есть ли способ обнаружить его?