默认页面恢复应用程序状态时,墓碑
本文关键字:墓碑 程序状态 应用 恢复 默认 | 更新日期: 2023-09-27 18:12:53
我想知道是否有任何方法可以在墓碑后将页面状态恢复到应用程序中的标准页面。例如,如果应用程序在用户访问第2页时被删除,则恢复的页面将始终是第1页。我对如何从我的应用程序第2页恢复数据有问题,我认为这种方法是克服这个问题的另一种选择。
public FeedPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(FeedPage_Loaded);
performanceProgressBar.Visibility = System.Windows.Visibility.Collapsed;
LoadFeed();
}
private void LoadFeed()
{
FrameworkElement root = Application.Current.RootVisual as FrameworkElement;
var currentFeed = root.DataContext as FeedViewModel;
WebClient client = new WebClient();
performanceProgressBar.IsIndeterminate = true;
performanceProgressBar.Visibility = System.Windows.Visibility.Visible;
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new Uri(currentFeed.FeedUrl));
this.DataContext = currentFeed;
ApplicationBar.IsVisible = false;
}
...
private void FeedPage_Loaded(object sender, RoutedEventArgs e)
{
if (!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
}
我的问题是,我现在不知道如何存储currentFeed,而tostone。每次应用程序被激活时,currentFeed都为空。我已经尝试了很多方法,但都没有结果。
public partial class App : Application
{
private static MainViewModel viewModel = null;
/// <summary>
/// A static ViewModel used by the views to bind against.
/// </summary>
/// <returns>The MainViewModel object.</returns>
public static MainViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
viewModel = new MainViewModel();
return viewModel;
}
}
/// <summary>
/// Provides easy access to the root frame of the Phone Application.
/// </summary>
/// <returns>The root frame of the Phone Application.</returns>
public PhoneApplicationFrame RootFrame { get; private set; }
/// <summary>
/// Constructor for the Application object.
/// </summary>
public App()
{
// Global handler for uncaught exceptions.
UnhandledException += Application_UnhandledException;
// Show graphics profiling information while debugging.
if (System.Diagnostics.Debugger.IsAttached)
{
// Display the current frame rate counters.
Application.Current.Host.Settings.EnableFrameRateCounter = true;
// Show the areas of the app that are being redrawn in each frame.
//Application.Current.Host.Settings.EnableRedrawRegions = true;
// Enable non-production analysis visualization mode,
// which shows areas of a page that are being GPU accelerated with a colored overlay.
//Application.Current.Host.Settings.EnableCacheVisualization = true;
}
// Standard Silverlight initialization
InitializeComponent();
// Phone-specific initialization
InitializePhoneApplication();
}
// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
}
// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
}
// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
}
// Code to execute when the application is closing (eg, user hit Back)
// This code will not execute when the application is deactivated
private void Application_Closing(object sender, ClosingEventArgs e)
{
}
// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// An unhandled exception has occurred; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
#region Phone application initialization
// Avoid double-initialization
private bool phoneApplicationInitialized = false;
// Do not add any additional code to this method
private void InitializePhoneApplication()
{
if (phoneApplicationInitialized)
return;
// Create the frame but don't set it as RootVisual yet; this allows the splash
// screen to remain active until the application is ready to render.
RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;
// Handle navigation failures
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
// Ensure we don't initialize again
phoneApplicationInitialized = true;
}
// Do not add any additional code to this method
private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
{
// Set the root visual to allow the application to render
if (RootVisual != RootFrame)
RootVisual = RootFrame;
// Remove this handler since it is no longer needed
RootFrame.Navigated -= CompleteInitializePhoneApplication;
}
#endregion
}
}
这是我的app. example .cs现在没有任何改变。有了这段代码,tombstone在mainpage和detailpage中工作得很好,但(当然)在feedpage中就不行。
看看你的app . example .cs中的以下方法:
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
private void Application_Activated(object sender, ActivatedEventArgs e)
这里是你应该保存和加载状态数据的地方。
这也是你可以强制应用程序导航到另一个页面的地方,但我强烈建议不要这样做。用户不期望这种行为,也许你甚至不会在市场上发布。这一点都不难做到,你所要做的就是在这些方法中加载和保存你的状态。
到目前为止你试着做什么?问题到底在哪里?
我对如何从我的应用程序第2页恢复数据有问题,我认为这种方法是克服这个问题的替代方案。
为什么不解决这个真正的问题呢?你所要求的不太可能通过市场认证,通常会被认为是一个糟糕的用户体验。
恢复数据超级容易。所以没有理由不去做。
嗯,这看起来很可疑
FrameworkElement root = Application.Current.RootVisual as FrameworkElement;
currentFeed = root.DataContext as FeedViewModel;
RootVisual肯定是你试图显示的页面本身吗?否则,它是另一个页面,根本没有被加载。
解决方案是避免使用Application.Current.RootVisual
中的DataContext。如果你问我,我认为这通常是不好的做法。
因此,要么你需要在State属性中手动持久化ViewModel,要么你需要以另一种方式解决它(我推荐后者)。
但是基本上你需要阅读更多关于如何为这个平台开发的内容。看一看一些已知有效的示例/教程。