Windows 8 动手实验系列教程 实验6:设置和首选项
动手实验
实验6:设置和首选项
2012年9月
简介
实验3介绍了合约并演示了应用程序如何轻松地与共享和搜索合约实现集成。合约同样包含设置超级按钮,它对活动的Windows应用商店应用的设置进行修改。在您选择设置超级按钮时出现的设置窗格中,操作系统提供一个权限命令,它允许用户启用或禁用程序的某些功能,例如对网络摄像头和麦克风的访问。值得注意的是您可以向设置窗格添加命令并将它们连接到设置页面。这为用户提供了方便地访问首选项,关于框和其他应用程序特定的设置内容。
在本实验中,您将向Contoso Cookbook的设置窗格添加About 和 Preferences命令。您将公开一个简单的用户首选项,它可以通过一个切换开关被打开和关闭,并且您将使用漫游设置存储这个首选项以使它跟随用户一起移动。
目标
本实验将向您展示如何:
- 向设置窗格添加About命令和关于页面。
- 向设置窗格添加Preferences(首选项)命令和首选项页面。
- 使用漫游设置存储用户首选项。
系统要求
您需要下列软件完成本实验:
- Microsoft Windows 8
- Microsoft Visual Studio 2012
设置
您必须执行以下步骤来准备本实验的计算机:
- 安装Microsoft Windows 8。
- 安装Microsoft Visual Studio 2012。
练习
本动手实验包含以下练习:
- 添加关于页面
- 添加首选项页面
- 实现首选项
完成本实验的预计时间:30至40分钟。
练习1: 添加关于页面
在本练习中您将向Contoso Cookbook添加一个简单的关于页面。您将使用在实验4中添加的Callisto库中的SettingsFlyout类来处理关于页面。
任务1 – 添加关于命令
第一步是向设置菜单添加一个About命令,我们将通过处理SettingsPane.CommandsRequested事件来完成。
1、在Visual Studio中打开您在实验4中完成的ContosoCookbook项目。如果您尚未完成实验4或希望从一个参考副本开始,您可以在开始材料中找到实验已完成的版本。
2、打开App.xaml.cs并添加以下using语句。
C#
using Windows.UI.ApplicationSettings; using Callisto.Controls; using Windows.UI;
3、向App类添加以下字段。
C#
private Color _background = Color.FromArgb(255, 0, 77, 96);
4、在OnLaunched方法中,紧挨着为SuggestionsRequested事件注册事件处理程序的语句之后,添加以下语句。
C#
// 在设置窗格为CommandsRequested 事件注册事件处理程序 SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
5、向OnSearchActivated方法添加相同的语句(再次紧挨着为SuggestionsRequested事件注册事件处理程序的语句之后),以保证即使应用程序从Windows 8搜索窗格被激活,CommandsRequested事件也会被处理。
6、向App.xaml.cs添加以下事件处理程序。
C#
void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) { // 添加关于命令 var about = new SettingsCommand("about", "About", (handler) => { var settings = new SettingsFlyout(); settings.Content = new AboutUserControl(); settings.HeaderBrush = new SolidColorBrush(_background); settings.Background = new SolidColorBrush(_background); settings.HeaderText = "About"; settings.IsOpen = true; }); args.Request.ApplicationCommands.Add(about); }
注意:这里您通过向传递给CommandsRequested事件的ApplicationCommands集合添加一个SettingsCommand对象以向设置菜单添加命令。SettingsCommand构造函数的第三个参数是命令被调用时被调用的处理程序。在本示例中,您使用Callisto中的SettingsFlyout类从处理程序显示关于页面。当然关于页面还没有被创建。您将在下一个任务中创建它。
任务 2 – 添加关于页面
在上一个任务中添加的事件处理程序向设置窗格添加了一个About命令。下一个步骤是为显示About命令添加一个关于页面。为创建该页面,我们需要在项目中添加一个新的用户控件。
1、在解决方案管理器中右键单击项目并使用Add - New Item命令在项目中添加一个用户控件。将文件命名为AboutUserControl.xaml,如图1所示。
图1 添加一个代表关于页面的用户控件
2、在AboutUserControl.xaml中向空的Grid添加以下语句。
XAML
<StackPanel> <TextBlock Text="Contoso Cookbook" FontFamily="Segoe UI" FontWeight="SemiLight" FontSize="26.667" /> <TextBlock Text="Trial Version" FontFamily="Segoe UI" FontWeight="SemiLight" FontSize="18" /> </StackPanel>
注意:现在关于页面通知用户这是Contoso Cookbook的试用版本。在实验8中您将使用Windows运行时中的应用商店API模拟应用程序的购买,当购买发生后您将用许可信息替换“试用版本”。
任务 3 – 测试结果
现在让我们测试您的修改并查看关于页面的外观。
1、按F5运行应用程序。
2、显示超级按钮并选择设置。
3、从设置窗格选择About命令。
4、确认出现开始页面,如图2所示。
图 2 Contoso Cookbook的关于页面
5、返回Visual Studio并停止调试。
练习 2: 添加首选项页面
现在您已经理解向设置窗格添加页面的机制,这次您将添加另一个页面:首选项页面。它允许用户输入并编辑首选项。我们只添加一个首选项来演示实现的方法,当然您可以添加任意数量的首选项。您添加的首选项将允许用户配置Contoso Cookbook启动时返回最后一次显示的食谱或食谱组。
任务 1 – 添加首选项命令
修改您在之前练习中编写的CommandsRequested事件处理程序并添加Preferences命令。
1、打开App.xaml.cs并找到OnCommandsRequested方法。
2、在添加About命令的语句后向OnCommandsRequested添加以下语句。
C#
// 添加一个首选项命令 var preferences = new SettingsCommand("preferences", "Preferences", (handler) => { var settings = new SettingsFlyout(); settings.Content = new PreferencesUserControl(); settings.HeaderBrush = new SolidColorBrush(_background); settings.Background = new SolidColorBrush(_background); settings.HeaderText = "Preferences"; settings.IsOpen = true; }); args.Request.ApplicationCommands.Add(preferences);
任务2 – 添加首选项页面
下一个任务是创建Preferences命令调用的页面。
1、在解决方案管理器中右键单击项目并使用Add > New Item命令在项目中添加一个新的用户控件。将文件命名为PreferencesUserControl.xaml。
2、在PreferencesUserControl.xaml中向空的Grid元素添加以下语句。
XAML
<ToggleSwitch x:Name="Remember" Header="Remember where I was" />
3、按F5运行应用程序。
4、显示超级按钮并选择设置超级按钮。
5、从设置窗格选择Preferences命令。
6、确认出现首选项页面并且包含一个切换开关,如图3所示。
图3 Contoso Cookbook的首选项页面
7、返回Visual Studio并停止调试。
任务3 – 记住首选项的状态
目前,首选项页面中的“Remember where I was(记住我的位置)”切换开关未与任何事物关联,并且不能记住状态。让我们通过在切换开关每次被点击时使用漫游设置保存它的状态,同时在首选项页面每次显示时对它进行初始化来修复此问题。
1、打开PreferencesUserControl.xaml并向ToggleSwitch控件添加Toggled属性。
XAML
<ToggleSwitch x:Name="Remember" Header="Remember where I was" Toggled="OnToggled" />
2、打开PreferencesUserControl.xaml.cs并添加以下using语句。
C#
using Windows.Storage;
3、然后添加以下方法。
C#
private void OnToggled(object sender, RoutedEventArgs e) { ApplicationData.Current.RoamingSettings.Values["Remember"] = Remember.IsOn; }
4、向PreferencesUserControl的构造函数(对InitializeComponent的调用之后)添加以下语句以在每次首选项页面显示时初始化切换开关。
C#
// 从漫游设置初始化切换开关 if (ApplicationData.Current.RoamingSettings.Values.ContainsKey("Remember")) Remember.IsOn = (bool)ApplicationData.Current.RoamingSettings.Values["Remember"];
注意:为处理保存和恢复设置和其他应用程序数据的任务,Windows运行时为您提供了Windows.Storage.ApplicationData类。ApplicationData允许您在本地、云(漫游存储)或临时存储存储数据。您保存的数据通过名称为LocalSettings 和RoamingSettings 的ApplicationData属性以名称-值对的形式存储。或者它可以存储在特殊的应用程序特定的文件夹中,这些文件夹可以通过ApplicationData的LocalFolder,RoamingFolder和TemporaryFolder属性来访问。
在漫游存储库中保留数据的优势是数据将跟随用户从一个设备转到另一个设备。此外,如果应用程序将数据写入RoamingSettings或RoamingFolder并且用户未以Microsoft账户登录或没有Internet连接,Windows运行时将自动在本地保留数据。因此将RoamingSettings或RoamingFolder作为用户首选项的存储可以带来很多方便。唯一需要提醒的是该平台对漫游存储中可以保存的数据大小进行了限制。在Windows 8预发布版中,您可以漫游大约100K字节的数据。在运行时,您可以从ApplicationData.RoamingStorageQuota属性获取配额的数量。
5、按F5运行应用程序。
6、显示超级按钮并选择设置超级按钮。
7、从设置窗格选择Preferences命令。
8、点击Remember where I was以启用切换开关。
9、取消设置窗格。
10、返回Visual Studio并停止调试。
11、按F5以再次启动应用程序。
12、转至首选项页面并确认切换开关被启用。
13、返回Visual Studio并停止调试。
练习3: 实现首选项
目前Contoso Cookbook每次启动时显示开始页面。在之前练习中添加名称为“Remember where I was”的用户首选项的目的是允许用户配置应用程序如何返回,即每次启动时转至上一次关闭时显示的页面。该用户首选项仅仅需要对代码进行细微的修改,因为Visual Studio已经在应用程序中包含当应用程序被挂起时保存导航状态的代码。
注意:进程生命周期管理是Windows应用商店应用的重要元素。当应用程序被挂起时,它可以在任何时候被操作系统终止。并且当应用程序被终止后,它的状态也将丢失。
用户不会因为暂时切换应用程序而去关心应用程序会丢失状态。这就是为什么Windows.UI.Xaml.Application类定义Suspending事件的原因。在应用被挂起前Suspending事件被触发。它为应用程序提供了保存状态的机会,以防止应用程序被操作系统终止并在之后被用户重新激活。触发事件的目的是当用户重新激活应用程序时能够恢复状态,以产生应用程序根本没有被终止的错觉。
Visual Studio在应用程序中包含一个名称为SuspensionManager的类。它位于项目Common文件夹的SuspensionManager.cs中。Visual Studio同时在App.xaml.cs的App构造函数中包含一行代码,它为Suspending事件注册了一个处理程序。该处理程序(OnSuspending)调用SuspensionManager.SaveAsync以保存应用程序的导航状态。导航状态包含用户查看的项或组,以及用户到达上述项或组的路径。
private async void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); await SuspensionManager.SaveAsync(); deferral.Complete(); }
此外Visual Studio在App.xaml.cs的OnLaunched方法中包含一个if子句,它负责当应用程序被挂起后又被操作系统终止时恢复应用程序的导航状态:
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { // Restore the saved session state only when appropriate await SuspensionManager.RestoreAsync(); }
所有这些工作的结果是您可以免费获得很多东西。如果Contoso Cookbook被挂起并终止,当重新启动时,它将自动转至您查看的最后页面。您可以通过在Visual Studio中按F5启动应用程序,选择某个食谱,并选择从Debug Location工具栏选择Suspend and shutdown以对它进行测试。
通过这种方式关闭应用程序后,按F5重新启动应用程序。上述步骤对应用程序被操作系统终止并被重新启动的过程进行了模拟。得益于Visual Studio的帮助,应用程序将返回至您关闭应用时查看的食谱。因为最近的应用程序历史也同时被恢复,您甚至可以使用后退按钮回溯在应用程序中的浏览步骤。
任务 1 –修改OnLaunched方法
Visual Studio已经包含当应用程序被挂起时保存导航状态以及如果被终止恢复状态的代码。我们将使用类似的策略以在应用程序被用户关闭后再次被启动且Remember where I was被启用时恢复导航状态。
1、打开App.xaml.cs并在靠近顶部处添加以下using语句。
C#
using Windows.Storage;
2、找到OnLaunched方法。紧靠await RecipeDataSource.LoadLocalDataAsync()语句后,添加以下语句。
C#
// If the app was closed by the user the last time it ran, and if "Remember // "where I was" is enabled, restore the navigation state if (args.PreviousExecutionState == ApplicationExecutionState.ClosedByUser) { if (ApplicationData.Current.RoamingSettings.Values.ContainsKey("Remember")) { bool remember = (bool)ApplicationData.Current.RoamingSettings.Values["Remember"]; if (remember) await SuspensionManager.RestoreAsync(); } }
注意:当应用程序被用户关闭时,我们不需要编写任何保存导航状态的代码,因为Suspending事件将在关闭应用程序几秒钟后触发。事实上并没有指示应用程序被用户关闭的事件。当您希望在应用程序关闭前保存状态,Suspending事件处理程序是完成上述工作的恰当位置。
任务 2 –测试结果
所有剩下的工作是进行一些测试以确认这些修改能够正常工作。
1、按F5运行应用程序。
2、显示超级按钮并选择设置超级按钮。
3、从设置窗格选择Preferences命令。
4、验证Remember where I was被启用。如果未被启用,则启用它。
5、取消设置窗格。
6、转至食谱页面。
7、通过从屏幕顶部向下轻扫或按Alt+F4以关闭应用程序。(不要使用Visual Studio中的Stop Debugging命令关闭应用程序)
8、返回Visual Studio并等待几秒钟以使进程结束。(通常需要花10秒钟。)
9、按F5再次运行应用程序。
10、确认Contoso Cookbook返回当您关闭应用程序时显示的食谱。
11、转至首选项页面并关闭Remember where I was。
12、当查看食谱页面时,通过从屏幕顶部向下轻扫或按Alt+F4以再次关闭应用程序。
13、返回Visual Studio并等待进程结束。
14、按F5再次运行应用程序。
15、确认您转至应用程序的开始页面而不是您最后查看的食谱页面。
16、返回Visual Studio并停止调试。
总结
设置和首选项是几乎每个Windows应用商店应用的重要组成部分。设置超级按钮为查看和编辑应用程序设置提供了一个熟悉和一致的模型,并且正如您在本实验中看到的那样,通过设置窗格公开应用程序的内容十分简单。Callisto库为通过SettingsFlyout控件呈现设置页面提供了方便,并且页面本身可以很方便地通过用户控件实现。
从实验1到现在,我们已经走过了很长一段路,但是还有更多的工作需要完成。接下来是成为明星Windows应用商店应用的另一个重要步骤:磁贴和通知。