WPF Page的概述

有关 Page 本身的使用并不是本文的内容,我们此处关心的是它在导航过程中的生命周期。在 WPF 中,Page 注定是个短命鬼,无论我们使用导航还是后退按钮都会重新创建 Page 对象实例,然后可能是日志对其恢复显示状态。也就是说日志只是记录了 Page 相关控件的状态数据,而不是 Page 对象引用(默认情况下)。

有两种方式来维持一个 Page 引用。第一种就是我们自己维持一个 Page 引用,比如使用某个类似 Application.Properties 这样的容器。

private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
 var page2 = Application.Current.Properties["page2"] as Page2;
 if (page2 == null)
 {
  page2 = new Page2();
  page2.label1.Content = DateTime.Now.ToString();
  Application.Current.Properties["page2"] = page2;
 }
 this.NavigationService.Navigate(page2);
 //this.NavigationService.Content = page2;
}

另外一种就是设置 Page.KeepAlive 属性,这样一来日志会记录该 Page 的引用,当我们使用前进后退按钮时,将不会再次创建该 Page 的对象实例。

<Page x:Class="Learn.WPF.Page2"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Title="Page2" Loaded="Page_Loaded"
 KeepAlive="True">
</page>
 

有一点需要注意:该方法仅对前进后退等日志操作有效。如果我们使用 HyperLink.NavigateUri 或 NavigationService.Navigate() 导航时依旧会生成新的页面实例,并可能代替日志中最后一个同类型的对象引用记录。另外,当多个页面存在循环链接时,会导致多个页面实例被日志记录,造成一定的内存浪费。

posted @ 2011-10-25 15:18  therockthe  阅读(2033)  评论(0)    收藏  举报