同一类型的多个框架Windows 8 c#

同一类型的多个框架Windows 8 c#,c#,windows-8,winrt-xaml,windows-store-apps,C#,Windows 8,Winrt Xaml,Windows Store Apps,我有一个Windows 8应用程序,其中有一个页面(框架)用于显示项目列表,还有一个页面用于下载和显示项目详细信息。我还使用MVVM Light发送通知 应用程序的使用如下所示: 打开主页 导航到列表页面 Frame.Navigate(typeof(MyPage)); 选择项目 //Complete logic Frame.GoBack(); 回到主页面,我开始在视图模型中下载文件,我发送一条通知消息,说是BeginDownloadFile,下载后发送一条通知消息,说是EndDownlo

我有一个Windows 8应用程序,其中有一个页面(框架)用于显示项目列表,还有一个页面用于下载和显示项目详细信息。我还使用MVVM Light发送通知

应用程序的使用如下所示:

  • 打开主页

  • 导航到列表页面

    Frame.Navigate(typeof(MyPage));
    
  • 选择项目

    //Complete logic
    Frame.GoBack();
    
  • 回到主页面,我开始在视图模型中下载文件,我发送一条通知消息,说是BeginDownloadFile,下载后发送一条通知消息,说是EndDownloadFile

  • 第一次执行步骤2、3和4时,我的NotificationReceived方法命中一次,第二次命中两次,以此类推

    private async void NotificationMessageReceived(NotificationMessage msg)
    {
        if (msg.Notification == Notifications.BeginDownloadFile)
        {
           FileDownloadPopup.IsOpen = true;
        }
        else if (msg.Notification == Notifications.EndDownloadFile)
        {
           FileDownloadPopup.IsOpen = false;
        }
    }
    
    附加信息:我只有一个FileDownloadPopup,但是每次调用NotificationMessageReceived方法时,都会显示一个额外的弹出窗口

    我唯一的结论是,在我的应用程序中,在向前和向后导航之间,有多个主页被创建并且从未关闭。这导致许多NotificationsMessageReceived方法只是等待通知出现,以便显示其弹出窗口

    我有两个问题: 1.这听起来像Windows 8应用程序的正常行为吗? 2.如何在不创建新实例的情况下关闭主页的所有实例或返回到以前的实例


    请在记下我的问题之前告诉我是否遗漏了一些重要的内容。这对我来说很正常。Windows 8中的默认导航行为是每次导航到新页面时创建一个新页面实例,而不管这是向前导航还是向后导航


    尝试将
    main页面上的
    navigationCacheMode
    设置为
    Required
    。请参阅。

    我觉得这很正常。Windows 8中的默认导航行为是每次导航到新页面时创建一个新页面实例,而不管这是向前导航还是向后导航


    尝试将
    main页面上的
    navigationCacheMode
    设置为
    Required
    。请参阅。

    听起来您是在页面中注册事件处理程序,而不是删除它们。每次您再次导航到该页面时,该处理程序都会在先前添加的处理程序的基础上再次添加。尝试在OnNavigatedTo中添加事件处理程序,并确保在OnNavigatedFrom中注销它

    protected override void OnNavigatedTo(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        MyEvent.OnDownloadRequest += MyLocalDOwnloadHandler;  // add the handler
    }
    
    protected override void OnNavigatedFrom(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        MyEvent.OnDownloadRequest -= MyLocalDOwnloadHandler;  // remove the handler
    }
    

    听起来像是在页面中注册EventHandler,然后不删除它们。每次您再次导航到该页面时,该处理程序都会在先前添加的处理程序的基础上再次添加。尝试在OnNavigatedTo中添加事件处理程序,并确保在OnNavigatedFrom中注销它

    protected override void OnNavigatedTo(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        MyEvent.OnDownloadRequest += MyLocalDOwnloadHandler;  // add the handler
    }
    
    protected override void OnNavigatedFrom(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        MyEvent.OnDownloadRequest -= MyLocalDOwnloadHandler;  // remove the handler
    }
    

    谢谢你的回复。阅读文档后,我更好地理解了导航的工作原理。我的工作假设页面的工作方式与WPF中的工作方式相同。我现在需要决定是否更改我的逻辑,以便每次为新页面或缓存页面工作。谢谢您的回复。阅读文档后,我更好地理解了导航的工作原理。我的工作假设页面的工作方式与WPF中的工作方式相同。我现在需要决定是否更改我的逻辑,以便每次为新页面或缓存页面工作。谢谢您的回复。您是对的,我正在注册我的事件,解决方案可能是在我离开页面时取消注册。根据我刚刚从ColineE的回答中学到的关于导航和页面的知识,我需要决定是更改缓存页面的逻辑还是更改新页面的逻辑。谢谢您的回复。您是对的,我正在注册我的事件,解决方案可能是在我离开页面时取消注册。根据我刚刚从ColineE的回答中学到的关于导航和页面的知识,我需要决定是更改缓存页面的逻辑还是更改新页面的逻辑。