1

我需要在每次页面加载时重新创建新的页面实例(也是当用户按下后退按钮时)。所以我重写了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问题是当用户按下后退按钮关闭对话框时我无法处理案例。我怎样才能检查它?或者有什么方法可以在返回历史状态时强制重新创建页面实例?

4

2 回答 2

0

哈,在最近的线程中,我有相反的问题:)

MessageBox 怎么样 - 这取决于您使用的是哪一个。例如,它可以是自定义消息框。无论如何,请尝试在 OnBackKeyPress() 中检查 MessageBox.IsOpened(或 MessageBox 的替代方法)。

另一种解决方案是每次都使用您希望成为新页面的 OnNavigatedTo() 。

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

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

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

于 2013-10-25T00:08:19.140 回答
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.
}
于 2013-10-25T08:08:10.247 回答