2011-04-05 118 views
1

我正在使用WPF NavigationWindow和一些页面,并希望能够知道应用程序何时关闭页面。
如何在没有主动通知NavigationWindow_Closing事件处理程序的页面的情况下完成此操作?如何取消从页面关闭的WPF应用程序?

我知道的技术here的,但不幸的是,当应用程序被关闭NavigationService_Navigating不叫。

+0

你的意思是,应该在应用程序决定时通知'Page'关闭?它可以做什么,你不能从主持页面的'Window'做到? – Jon 2011-04-05 13:17:56

+0

@Jon:作为一个例子,页面可能不得不将某些UI元素的状态保存到设置中。该窗口无权访问这些UI元素。 – Marc 2011-04-05 13:28:23

回答

1

一种方法是有页面参与支持的接口,如:

public interface ICanClose 
{ 
    bool CanClose(); 
} 

实现在页面级这个接口:

public partial class Page1 : Page, ICanClose 
{ 
    public Page1() 
    { 
     InitializeComponent(); 
    } 

    public bool CanClose() 
    { 
     return false; 
    } 
} 

在导航窗口中,查看如果孩子是ICan关闭:

private void NavigationWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    ICanClose canClose = this.Content as ICanClose; 

    if (canClose != null && !canClose.CanClose()) 
     e.Cancel = true; 
} 
+0

[+1]我想出了正是这种解决方案现在,虽然我的方法称为CancelApplicationClosing():-) – Marc 2011-04-05 14:27:48

2

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

要获取NavigationWindow中承载的Page,您可以使用VisualTreeHelper深入了解其后代,直到找到唯一的WebBrowser控制。您可以手动编写此代码,但可以使用网络上的good code like this

获得WebBrowser之后,通过WebBrowser.Document属性可以轻松获得内容。要做到这一点