【问题标题】:Windows Phone Back button and page instance creationWindows Phone 后退按钮和页面实例创建
【发布时间】:2013-10-24 23:37:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    为什么需要重新创建页面实例?如果你只是想重新读取要显示的数据,为什么不把数据加载逻辑放到 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.
    }
    

    【讨论】:

    • 是的,我再次思考了逻辑,明白了,我需要将数据初始化和数据重新加载分开。我关于覆盖OnBackKeyPress 的决定是快速而糟糕的。现在我在页面构造函数中初始化所有内容(它与NavigationMode.New 相同吗?)并在OnNavigatedTo 上重新初始化。
    【解决方案2】:

    哈,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 上拥有其他数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      相关资源
      最近更新 更多