为什么基本页面不提供OnNavigatedTo()事件?

时间:2013-01-24 02:36:01

标签: c# visual-studio-2012 windows-store-apps

试图确定为什么我的应用程序(基于这个"空白应用程序"模板进入这个勇敢的新世界)并不像我期望的那样工作(http://stackoverflow.com / questions / 14467756 / why-would-my-event-handler-not-get-called),我启动了一个新的Blank项目,然后删除了MainPage并添加了一个新的Basic(非Blank)页面,我命名为MainPage以纪念离开的页面(以及对传统和懒惰的点头 - 所以我不必更改导航到该页面的app.xaml.cs中的代码。)

Blank应用程序创建了这样的原始MainPage.xaml.cs(自动生成的注释省略):

namespace AsYouWish
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
    }
}

...我用BasicPage(而不是BlankPage)替换它,它生成了这个:

namespace AsYouWish
{
    public sealed partial class MainPage : AsYouWish.Common.LayoutAwarePage
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
        {
        }

        protected override void SaveState(Dictionary<String, Object> pageState)
        {
        }
    }

因此Basic Page获取LoadState()和SaveState(),而Blank Page的MainPage具有OnNavigatedTo()。为什么基本页面也没有OnNavigatedTo()事件?似乎每个页面都有可能被导航到(并且从那个事件中我可以看到更可能是可选的/不必要的)。

1 个答案:

答案 0 :(得分:5)

这只是正在使用的页面模板的问题。 OnNavigatedTo虚拟方法在Page类中实现,因此可以在直接或间接从其继承的任何类中覆盖它。唯一的区别是用于MainPage.xaml.cs的模板中已经有一个空的OnNavigatedTo方法,BasicPage模板没有。

通过添加以下代码,没有什么可以阻止您覆盖该方法:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    // add you own code here
}

请确保您保持base.OnNavigatedTo(e)来电,否则您将失去LayoutAwarePage中已实施的功能(启用LoadState / SaveState)。

如果您不知道,在Visual Studio中为您的类添加替换非常容易。只需输入override并按空格键,系统就会打开一个下拉菜单,其中包含您可以在班级中覆盖的所有方法。一旦你选择其中一个,完整的空方法将被添加到你的班级,就像我在上面的答案中包含的方法一样。