【问题标题】:How to cancel WPF app closing from Page?如何从页面取消 WPF 应用程序关闭?
【发布时间】:2011-04-05 13:13:57
【问题描述】:

我正在使用 WPF NavigationWindow 和一些页面,并且希望能够知道应用程序何时从页面关闭。
如果不从 NavigationWindow_Closing 事件处理程序主动通知页面,如何做到这一点?

我知道here 技术,但不幸的是,在应用程序关闭时没有调用 NavigationService_Navigating。

【问题讨论】:

  • 您的意思是当应用程序决定关闭时应该通知Page?它可以做哪些您已经无法通过托管页面的Window 做的事情?
  • @Jon:例如,页面可能必须将某些 UI 元素的状态保存到设置中。 Window 无权访问这些 UI 元素。

标签: c# wpf navigationwindow


【解决方案1】:

如果我对您的理解正确,您的问题是如何访问NavigationWindow 中托管的内容。知道窗口本身正在关闭是微不足道的,例如您可以订阅Closing 事件。

要获得NavigationWindow 中托管的Page,您可以使用VisualTreeHelper 向下钻取其后代,直到找到唯一的WebBrowser 控件。您可以手动编写代码,但网上有 good code like this 可供使用。

获得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 && !canClose.CanClose())
            e.Cancel = true;
    }
    

    【讨论】:

    • [+1] 虽然我的方法叫做 CancelApplicationClosing() :-) 我现在想出了这个解决方案
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多