Windows Phone Back按钮和页面实例创建

时间:2013-10-24 23:37:36

标签: windows-phone-7 windows-phone-8 windows-phone

我需要在每个页面加载时重新创建新页面实例(当用户按下后退按钮时)。 所以我压倒了OnBackKeyPress方法:

protected override void OnBackKeyPress(CancelEventArgs e)
{
    base.OnBackKeyPress(e);
    if (NavigationService.CanGoBack) {
        e.Cancel = true;
        var j = NavigationService.RemoveBackEntry();
        NavigationService.Navigate(j.Source);
        NavigationService.RemoveBackEntry();
    }
}

问题是,当用户按下后退按钮关闭CustomMessageBox对话框时,我无法处理案例。我怎么检查呢?或者有什么方法可以在返回历史状态时强制重新创建页面实例?

2 个答案:

答案 0 :(得分:0)

哈,in the near thread,我有相反的问题:)

MessageBox怎么样 - 它取决于你使用的是哪一个。例如,它可以是custom message box。无论如何,尝试在OnBackKeyPress()中检查MessageBox.IsOpened(或MessageBox的替代方法)。

另一个解决方案是每次都要使用想要成为新内容的页面的OnNavigatedTo()。

第三个解决方案:如果您使用Mvvm Light,请在ViewModel getter中添加一些唯一ID,例如

public MyViewModel MyViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MyViewModel>((++Uid).ToString());
        }
    }

这会强制每次重新创建新的ViewModel,因此您将拥有不同的VM实例,因此您将在View上获得另一个数据。

答案 1 :(得分:0)

为什么需要重新创建页面实例?如果您只是想重新读取要显示的数据,为什么不将数据加载逻辑放入OnNavigatedTo()?

假设这是你实际想要实现的目标,尝试这样的事情......

public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();
        // don't do your data loading here.  This will only be called on page creation.
    }

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

    MyViewModel model;

    async void LoadData()
    {
        model = new MyViewModel();
        await model.LoadDataAsync();
    }
}

如果您还需要在第一次构建页面时运行特定逻辑而不是在后退键导航上运行,请检查传递给OnNavigatedTo的NavigationEventArgs对象的NavigationMode属性。

if(e.NavigationMode == NavigationMode.New)
{
    //do what you need to do specifically for a new page instance
}
if (e.NavigationMode == NavigationMode.Back)
{
    // do anything specific for back navigation here.
}