Windows 8 c#的相同类型的多个帧

时间:2012-12-05 06:24:07

标签: c# windows-8 winrt-xaml windows-store-apps

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

应用程序的用法如下:

  1. 打开主页

  2. 导航到列表页面

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

    //Complete logic
    Frame.GoBack();
    
  4. 回到主页面,我开始在视图模型中下载文件,我发送 ONE NotificationMessage说BeginDownloadFile并在下载 ONE NotificationMessage后说EndDownloadFile

  5. 我第一次做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方法时都会显示一个额外的弹出窗口。

    我唯一的结论是,在我的应用程序中向前和向后导航之间,有多个MainPages正在创建并且从未关闭。这会导致许多NotificationsMessageReceived方法只是等待通知来到他们的方式,以便他们可以显示他们的弹出窗口。

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

    如果我在记下问题之前遗漏了重要信息,请告诉我。

2 个答案:

答案 0 :(得分:4)

这对我来说听起来很正常。 Windows 8中的默认导航行为是每次导航到新页面时创建新的页面实例,无论这是前向还是后向导航。

尝试将NavigatinCacheMode上的MainPage设置为Required。请参阅MSDN documentation for details of how page caching works

答案 1 :(得分:3)

听起来您正在页面中注册事件处理程序,然后不删除它们。每次再次导航到页面时,除了先前添加的处理程序之外,还会再次添加处理程序。尝试在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
}