pageState 和 viewModelState 在 UWP 中的页面导航上为 null
pageState and viewModelState is null on Page Navigation in UWP
我正在使用带有 UWP 的 Prism 6。我在 MainPage.xaml 中有一个重定向到 DashboardPage.xaml 的按钮。在 DashboardPage 中,我将视图状态保存在 DashboardPage.xaml.cs 中:
protected override void SaveState(Dictionary<string, object> pageState)
{
base.SaveState(pageState);
pageState["viewState"] = 123;
}
并在 DashboardPageViewModel.cs 中保存视图模型状态:
public override void OnNavigatingFrom(NavigatingFromEventArgs e, Dictionary<string, object> viewModelState, bool suspending)
{
base.OnNavigatingFrom(e, viewModelState, suspending);
}
[RestorableState]
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
通过按顶部栏的后退按钮,我返回到 MainPage.xaml。之后,当我再次导航到 DashboardPage.xaml 时,我发现视图状态和视图模型状态为空。这意味着,在下面的 DashboardPage.xaml.cs
代码中
protected override void LoadState(object navigationParameter, Dictionary<string, object> pageState)
{
if (pageState == null)
{
return;
}
base.LoadState(navigationParameter, pageState);
if (pageState.ContainsKey("viewState"))
{
var data = pageState["viewState"].ToString();
}
}
pageState 被发现为空。
并且,对于 DashboardPageViewModel.cs 中的视图模型状态:
public async override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState)
{
base.OnNavigatedTo(e, viewModelState);
}
viewModelState 为空
By pressing back button from topbar, I went back to MainPage.xaml. After that, when I navigate to DashboardPage.xaml again, I found that view state and view model states are being null.
来自您发布的项目。我发现您使用 NavigationService.Navigate
导航到 DashboardPage。第一次是正确的,但是在您导航回 MainPage 并再次导航回 DashboardPage 之后。您还使用了 NavigationService.Navigate
API.
我下载了 Prism 的源代码并找到了调用 LoadState
的位置:
protected override void OnNavigatedTo(NavigationEventArgs navigationEventArgs)
{
...
if (navigationEventArgs.NavigationMode == NavigationMode.New)
{
var nextPageKey = _pageKey;
int nextPageIndex = frameFacade.BackStackDepth;
while (frameState.Remove(nextPageKey))
{
nextPageIndex++;
nextPageKey = "Page-" + nextPageIndex;
}
// Pass the navigation parameter to the new page
LoadState(navigationEventArgs.Parameter, null);
}
else
{
LoadState(navigationEventArgs.Parameter, (Dictionary<String, Object>)frameState[_pageKey]);
}
}
如您所见,LoadState
在 OnNavigatedTo
内部调用,PageState
作为参数传递 ,条件是 NavigationMode 不是 New. ViewModelState
也是类似的情况。对于您的情况,每次通过 NavigationService.Navigate
导航到一个页面都会创建一个全新的页面,这意味着 NavigationMode=NavigationMode.New
。因此 PageState 和 ViewModelState 为空。
从 NavigationMode 文档中我们可以看到 NavigationMode.Forward
符合您的要求。
所以,解决这个问题。唯一需要做的就是修改 MainPageViewModel.cs
中的 OnPageChange
方法,如下代码:
private void OnPageChange()
{
if (_navigationService.CanGoForward())
{
_navigationService.GoForward();
}
else
{
_navigationService.Navigate("Dashboard", null);
}
}
我正在使用带有 UWP 的 Prism 6。我在 MainPage.xaml 中有一个重定向到 DashboardPage.xaml 的按钮。在 DashboardPage 中,我将视图状态保存在 DashboardPage.xaml.cs 中:
protected override void SaveState(Dictionary<string, object> pageState)
{
base.SaveState(pageState);
pageState["viewState"] = 123;
}
并在 DashboardPageViewModel.cs 中保存视图模型状态:
public override void OnNavigatingFrom(NavigatingFromEventArgs e, Dictionary<string, object> viewModelState, bool suspending)
{
base.OnNavigatingFrom(e, viewModelState, suspending);
}
[RestorableState]
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
通过按顶部栏的后退按钮,我返回到 MainPage.xaml。之后,当我再次导航到 DashboardPage.xaml 时,我发现视图状态和视图模型状态为空。这意味着,在下面的 DashboardPage.xaml.cs
代码中protected override void LoadState(object navigationParameter, Dictionary<string, object> pageState)
{
if (pageState == null)
{
return;
}
base.LoadState(navigationParameter, pageState);
if (pageState.ContainsKey("viewState"))
{
var data = pageState["viewState"].ToString();
}
}
pageState 被发现为空。
并且,对于 DashboardPageViewModel.cs 中的视图模型状态:
public async override void OnNavigatedTo(NavigatedToEventArgs e, Dictionary<string, object> viewModelState)
{
base.OnNavigatedTo(e, viewModelState);
}
viewModelState 为空
By pressing back button from topbar, I went back to MainPage.xaml. After that, when I navigate to DashboardPage.xaml again, I found that view state and view model states are being null.
来自您发布的项目。我发现您使用 NavigationService.Navigate
导航到 DashboardPage。第一次是正确的,但是在您导航回 MainPage 并再次导航回 DashboardPage 之后。您还使用了 NavigationService.Navigate
API.
我下载了 Prism 的源代码并找到了调用 LoadState
的位置:
protected override void OnNavigatedTo(NavigationEventArgs navigationEventArgs)
{
...
if (navigationEventArgs.NavigationMode == NavigationMode.New)
{
var nextPageKey = _pageKey;
int nextPageIndex = frameFacade.BackStackDepth;
while (frameState.Remove(nextPageKey))
{
nextPageIndex++;
nextPageKey = "Page-" + nextPageIndex;
}
// Pass the navigation parameter to the new page
LoadState(navigationEventArgs.Parameter, null);
}
else
{
LoadState(navigationEventArgs.Parameter, (Dictionary<String, Object>)frameState[_pageKey]);
}
}
如您所见,LoadState
在 OnNavigatedTo
内部调用,PageState
作为参数传递 ,条件是 NavigationMode 不是 New. ViewModelState
也是类似的情况。对于您的情况,每次通过 NavigationService.Navigate
导航到一个页面都会创建一个全新的页面,这意味着 NavigationMode=NavigationMode.New
。因此 PageState 和 ViewModelState 为空。
从 NavigationMode 文档中我们可以看到 NavigationMode.Forward
符合您的要求。
所以,解决这个问题。唯一需要做的就是修改 MainPageViewModel.cs
中的 OnPageChange
方法,如下代码:
private void OnPageChange()
{
if (_navigationService.CanGoForward())
{
_navigationService.GoForward();
}
else
{
_navigationService.Navigate("Dashboard", null);
}
}