Как отменить закрытие приложения WPF со страницы?

#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 () 🙂