Страница по умолчанию для восстановления состояния приложения во время захоронения

Мне интересно, есть ли способ восстановить состояние страницы на стандартной странице в приложении после захоронения. Например, если приложение было захоронено, когда пользователь находится на странице 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 в то время как tobstone. Каждый раз, когда приложение активируется, 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 как есть сейчас без каких-либо изменений. С этим кодом, tombstone отлично работает на главной странице и странице сведений, но не (конечно) на странице новостей.

2 ответа

Посмотрите на следующие методы в вашем App.xaml.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 будет самой страницей, которую вы пытаетесь отобразить? В противном случае это другая страница, которая вообще не загружается.

Решение будет избегать использования DataContext из Application.Current.RootVisual, Как правило, это плохая практика, если вы спросите меня.

Так что либо вам нужно сохранить вашу ViewModel вручную в свойстве State, либо вам нужно разрешить его альтернативным способом (я рекомендую последнее).

Но в основном вам нужно больше узнать о том, как разрабатывать для платформы. Взгляните на некоторые примеры / учебные пособия, которые, как известно, работают.

Другие вопросы по тегам