是什么决定了NavigationCommands.BrowseBack是否调用了页面构造函数?

时间:2011-04-12 20:27:29

标签: c# wpf navigationservice

我有两个页面,其中包含类似的逻辑。加载页面,单击将显示/隐藏其他按钮的一些按钮,继续下一页。当我点击下一页时,如果单击后退按钮,我将返回上一页。

不同之处在于,当我单击后退按钮时,一个页面(FirstPage)将调用构造函数,后面的按钮会调用重置默认值。另一个页面(SecondPage)没有调用构造函数,我不知道为什么。

public FirstPage()
{
  InitializeComponent();
  DisplayStuff();
}

FirstPage已将KeepAlive设置为False

public SecondPage(object arg1, object arg2)
{
  InitializeComponent();
  DisplayStuff(arg1, arg2);
}

此页面的KeepAlive也设为False。这两个页面不会继承任何内容,也没有任何内容覆盖任何属性。我能看到的唯一区别是空构造函数,所以我尝试给SecondPage一个空构造函数,但仍然没有运气。

我对WPF比较陌生(我每6个月工作一两个小时),所以我错过了什么?

如果相关,这是后退按钮。

<Button Command="{x:Static NavigationCommands.BrowseBack}" />

编辑:当我单击后退按钮时,SecondPage不会保持其状态。它只是加载一个空页面,因为尚未调用DisplayStuff

导航代码:

NavigateTo(new SecondPage(arg1, arg2));

protected void NavigateTo(Page page)
{
  NavigationService.Navigate(page);
}

2 个答案:

答案 0 :(得分:1)

我创建了一个类似的示例应用程序并且具有类似的行为。我发现当你回到页面时,除非页面是期刊中的第一页,否则不会调用构造函数

请阅读Navigation in WPF中的此部分:

  

使用日志导航页面页面时,会执行以下步骤:

     
      
  1. 实例化页面(后堆栈上的顶级日记帐分录)。

  2.   
  3. 页面将使用与页面的日记帐分录一起存储的状态进行刷新。

  4.   
  5. 将页面导航回。

  6.   
祝你好运!

答案 1 :(得分:1)

阅读Paul Stovell's article on WPF navigation之后,我想要显示内容的方式无效。

  

导航时,如果单击“返回”,WPF可能无法知道要传递给构造函数的值;因此它必须保持页面活着。这是跟踪输出:

由于WPF无法调用构造函数,因此不会。它只会使页面保持活跃状态​​。

他接着提到KeepAlive如果您没有通过URI导航,并且每次调用LoadedUnloaded都不起作用,那么我可以全部移动我在那里的逻辑,我不需要在后面的导航中调用构造函数。