2

我想知道在墓碑之后是否有任何方法可以将页面状态恢复到应用程序中的标准页面。例如,如果应用程序在用户位于第 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();
    }
}

我的问题是我现在不知道如何在 tobstone 时存储 currentFeed。每次激活应用程序时,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.xaml.cs 现在没有任何更改。使用此代码,墓碑在主页和详细信息页面中可以正常工作,但在提要页面中(当然)不能正常工作。

4

2 回答 2

0

我在如何从我的应用程序的第 2 页恢复数据时遇到问题,我认为这种方法是克服此问题的替代方法。

为什么不解决这个,你真正的问题?您要求的内容不太可能通过市场认证,并且通常被认为是糟糕的用户体验。

恢复数据超级简单。所以没有理由不这样做。

更新

嗯,这看起来相当可疑

FrameworkElement root = Application.Current.RootVisual as FrameworkElement;
currentFeed = root.DataContext as FeedViewModel;

RootVisual 肯定是您要显示的页面本身吗?否则,它是另一个页面,根本没有被加载。

解决方案是避免使用来自Application.Current.RootVisual. 如果你问我,这通常是不好的做法。

因此,要么您需要手动将 ViewModel 保存在 State 属性中,要么您需要以另一种方式解决它(我会推荐后者)。

但基本上你需要阅读更多关于如何为平台开发的信息。查看一些已知有效的示例/教程。

于 2011-11-01T11:54:42.943 回答
0

查看 App.xaml.cs 中的以下方法:

private void Application_Deactivated(object sender, DeactivatedEventArgs e)

private void Application_Activated(object sender, ActivatedEventArgs e)

这里是你应该保存状态数据和从隔离存储中加载状态数据的地方。

这也是您可以强制应用导航到另一个页面的地方,但我强烈建议您不要这样做。用户没有预料到这种行为,也许你甚至不会在市场上发表。这一点也不难,你所要做的就是在这些方法中加载和保存你的状态。

到目前为止,您尝试做什么?问题究竟出在哪里?

于 2011-11-01T12:18:54.913 回答