#c# #wpf #navigationwindow
#c# #wpf #navigationwindow
Вопрос:
Я использую WPF NavigationWindow и некоторые страницы и хотел бы иметь возможность знать, когда приложение закрывается со страницы.
Как это можно сделать без активного уведомления страницы из обработчика событий NavigationWindow_Closing?
Я знаком с приведенным здесь методом, но, к сожалению, NavigationService_Navigating не вызывается при закрытии приложения.
Комментарии:
1. Вы имеете в виду, что
Page
должно быть получено уведомление, когда приложение решит закрыться? Что оно может сделать такого, чего вы уже не можете сделать сWindow
, на котором размещена страница?2. @Jon: В качестве примера Странице может потребоваться сохранить состояние некоторых элементов пользовательского интерфейса в настройках. Окно не имеет доступа к этим элементам пользовательского интерфейса.
Ответ №1:
Если я вас правильно понял, ваша проблема заключается в том, как получить доступ к контенту, размещенному внутри NavigationWindow
. Знать, что само окно закрывается, тривиально, например, есть Closing
событие, на которое вы можете подписаться.
Чтобы получить Page
размещенный в NavigationWindow
, вы можете использовать VisualTreeHelper
для детализации его потомков, пока не найдете один-единственный WebBrowser
элемент управления. Вы могли бы закодировать это вручную, но в сети есть хороший код, подобный этому, готовый к использованию.
После того, как вы получите WebBrowser
, получить доступ к содержимому с помощью WebBrowser.Document
свойства тривиально просто.
Ответ №2:
Один из способов сделать это — заставить задействованные страницы поддерживать интерфейс, такой как:
public interface ICanClose
{
bool CanClose();
}
Реализуйте этот интерфейс на уровне страницы:
public partial class Page1 : Page, ICanClose
{
public Page1()
{
InitializeComponent();
}
public bool CanClose()
{
return false;
}
}
В окне навигации проверьте, не является ли дочерним элементом ICanClose:
private void NavigationWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
ICanClose canClose = this.Content as ICanClose;
if (canClose != null amp;amp; !canClose.CanClose())
e.Cancel = true;
}
Комментарии:
1. [ 1] На данный момент я придумал именно это решение, хотя мой метод называется CancelApplicationClosing () 🙂