位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 管理状态

提问人:刘团圆发布时间:2020-12-11

    与桌面应用程序不同,应用程序必须能随时暂停。在用户切换到另一个应用程序或桌面时,就会发生这种情况。所以它必须是一个由所有应用程序处理的常见场景。当应用程序暂停时,Windows将保存变量的值和数据结构,并在应用程序恢复执行时恢复它们,然而,应用程序可能己经暂停了较长时间,所以如果数据(如新闻摘要)随着时间的推移而变化,就应该在应用程序恢复执行时更新它。

   暂停应用程序时,还应该考虑调用应用程序之间应保存的任何数据,如果应用程序随后由Windows或用户终止了,就没有机会这样做。

   应用程序要暂停时,会发送Suspending事件,应该处理该事件。当应用程序恢复执行时,它将接收Resuming事件。处理这两个事件,保存应用程序的状态,就可以把应用程序返回到暂停之前的状态,且用户不会注意到什么。


试一试  从暂停中恢复:Ch25Ex06

(1)回到前面的示例,并创建一个新类AppState:

using System.Collections.Generic; 

namespace BasicNavigation

{

  public static class AppState

  {

    private static Dietionary<string, bool> state = new Dictionary<string, bool>(); 

    public static bool GetState(string pageName) => state.ContainsKey(pageName) ? 

state[pageName] : false;

    public static void SetState(string pageName, bool isBold)

    {

      if (state.ContainsKey(pageName)) 

        state[pageName] = isBold; 

      else

        state.Add(pageName, isBold);

    }

    public static void Save ()

    {

      var settings = Windows.Storage.ApplicationData.Current.RoamingSettings; 

      foreach (var key in state.Keys)

      {

        settings.Values[key] = state[key];

      }

    }

    public static void Load{string pageName)

    {

      if (!state,ContainsKey(pageName) $$ Windows.Storage-ApplicationData.Current. RoamingSettings.Values.ContainsKey(pageName))

      state.Add(pageName, (bool)Windows.Storage.ApplicationData.Current. 

RoamingSettings.Values(pageName]);

    }

  }

}

(2)打开app.xaml文件的代码隐藏文件,在底部定位OnSuspending方法。添加AppState.Save(),如下所示:

private void OnSuspending(object sender, SuspendingEventArgs e)

{

  var deferral = e.SuspendingOperation.GetDeferral{);

  //TODO: Save application state and stop any background activity 

  AppState.Save(); 

  deferral.Complete();

}

(3)在OnLaunched方法的底部、Window.Current.Activate();的前面添加如下代码:

    AppState.Load(typeof(BlankPagel).Name);

    AppState.Load{typeof(BlankPage2).Name);

    AppState.Load(typeof(BlankPage3).Name);

(4)进入BlankPagel,在Page类上添加loaded事件,如下所示:

<Page

    x:Class="BasicNavigation.BlankPagel"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="using:BasicNavigation"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d" Loaded="Page_Loaded">

(5)实现事件:

private void Page_Loaded(object sender, RoutedEventArgs e)

{

    toggleButtonBold.IsChecked = AppState.GetState{GetType().Name); 

    AppBarToggleButtonBold_Click(toggleButtonBold, new RoutedEventArgs());

}

(6)修改开关按钮的Click事件处理程序,在按下按钮时保存页面的状态:

private void AppBarToggleButtonBold_Click(object sender, RoutedEventArgs e)

{

  AppState.SetState{GetType().Name, (bool)toggleButtonBold.IsChecked);

  ...

}

(7)对BlankPage2和BlankPage3重复步骤(4)到步骤(6)。

(8)在app.xaml代码隐藏文件中,给OnSuspending方法设置一个断点。

(9)运行该应用程序。

(10)一旦运行应用程序,就单击一两个页面上的Bold按钮。然后,应用程序仍在运行,返回Visual Studio。如果没有显示Debug Location工具栏,则在工具栏区域右击并确保选中它。单击Lifecycle Events下拉框,单击Suspend。

(11)一旦单步执行OnSuspended方法,应用程序就暂停。再次展开下拉框,单击Resume。


示例说明

    AppState类使用Wmdows.Storage.ApplicationData类来保存应用程序设置。这个类允许访问应用程序数据存储,轻松地设置一些简单的值。应该只在这个库中存储简单类型,如果需要保存应用程序中非常复杂的状态, 应该考虑其他一些机制,如数据库或XML文件。

    应用程序己经在app.xaml代码隐藏代码文件中处理了 Suspending事件,所以可以简单地使用它。如果必须为某些页面单独暂停事件,也应该在页面本身处理这个事件。

    在OnSuspending事件中,保存了整个应用程序的状态,以便在应用程序重新启动时可以检索它。由于在应用程序从暂停中恢复时,任何页面都没有必须要更新的数据,所以没有处理Resuming事件。

    在OnLaunched方法加载应用程序时,恢复状态,OnLaunched方法也位于app.xaml代码隐藏文件中。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部