动手实验

实验6:设置和首选项

2012年9月

简介

实验3介绍了合约并演示了应用程序如何轻松地与共享和搜索合约实现集成。合约同样包含设置超级按钮,它对活动的Windows应用商店应用的设置进行修改。在您选择设置超级按钮时出现的设置窗格中,操作系统提供一个权限命令,它允许用户启用或禁用程序的某些功能,例如对网络摄像头和麦克风的访问。值得注意的是您可以向设置窗格添加命令并将它们连接到设置页面。这为用户提供了方便地访问首选项,关于框和其他应用程序特定的设置内容。

在本实验中,您将向Contoso Cookbook的设置窗格添加AboutPreferences命令。您将公开一个简单的用户首选项,它可以通过一个切换开关被打开和关闭,并且您将使用漫游设置存储这个首选项以使它跟随用户一起移动。

目标

本实验将向您展示如何:

  • 向设置窗格添加About命令和关于页面。
  • 向设置窗格添加Preferences首选项)命令和首选项页面。
  • 使用漫游设置存储用户首选项。

系统要求

您需要下列软件完成本实验:

  • Microsoft Windows 8
  • Microsoft Visual Studio 2012

设置

您必须执行以下步骤来准备本实验的计算机:

  1. 安装Microsoft Windows 8。
  2. 安装Microsoft Visual Studio 2012。

练习

本动手实验包含以下练习:

  1. 添加关于页面
  2. 添加首选项页面
  3. 实现首选项

完成本实验的预计时间:3040分钟

练习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(, , , );

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允许您在本地、云(漫游存储)或临时存储存储数据。您保存的数据通过名称为LocalSettingsRoamingSettings ApplicationData属性以名称-值对的形式存储。或者它可以存储在特殊的应用程序特定的文件夹中,这些文件夹可以通过ApplicationDataLocalFolderRoamingFolderTemporaryFolder属性来访问。

在漫游存储库中保留数据的优势是数据将跟随用户从一个设备转到另一个设备。此外,如果应用程序将数据写入RoamingSettingsRoamingFolder并且用户未以Microsoft账户登录或没有Internet连接,Windows运行时将自动在本地保留数据。因此将RoamingSettingsRoamingFolder作为用户首选项的存储可以带来很多方便。唯一需要提醒的是该平台对漫游存储中可以保存的数据大小进行了限制。在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应用商店应用的另一个重要步骤:磁贴和通知。

Windows 8 动手实验系列教程 实验6:设置和首选项的更多相关文章

  1. Windows 8 动手实验系列教程 实验5:进程生命周期管理

    动手实验 实验5:进程生命周期管理 2012年9月 简介 进程生命周期管理对构建Windows应用商店应用的开发者来说是需要理解的最重要的概念之一.不同于传统的Windows应用(它们即使在后台仍然继 ...

  2. Windows 8 动手实验系列教程 实验8:Windows应用商店API

    动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商店.考虑到世界范围内目前有超过 ...

  3. Windows 8 动手实验系列教程 实验7:磁贴和通知

    动手实验 实验7:磁贴和通知 2012年9月 简介 磁贴是Windows应用商店应用用户体验的重要元素.当应用程序被安装后,它的磁贴将在Windows 8开始屏幕被创建.该磁贴(称为主磁贴)作为启动应 ...

  4. XamarinEssentials教程移除键值首选项的键值

    XamarinEssentials教程移除键值首选项的键值 如果开发者不再使用首选项中的某一项时,可以将该项移除掉.此时可以使用Preferences类的Remove()方法,该方法可以将存在于首选项 ...

  5. Windows phone 应用开发系列教程(更新中)

    Windows phone 应用开发[1]-Text To Speech        作为开篇章节.第一篇将在如下介绍一些Windows phone比较有意思的东西-Text To Speech[文 ...

  6. ArcGIS10从入门到精通系列实验图文教程(附配套实验数据持续更新)

    @ 目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 本教程<ArcGIS从入门到精通系列实验教程>内容包括:ArcGIS平台简介.ArcGIS应用基础.空间数据的采集 ...

  7. 2019-9-16 java上课知识整理总结(动手动脑,课后实验)

    java上课知识整理总结(动手动脑,课后实验) 一,课堂测试 1,题目:课堂测试:像二柱子那样,花二十分钟写一个能自动生成30道小学四则运算题目的 “软件” 要求:(1)题目避免重复: (2)可定制( ...

  8. Silverlight,Windows 8应用开发实例教程系列汇总

    Kevin Fan分享开发经验,记录开发点滴 Silverlight,Windows 8应用开发实例教程系列汇总 2012-06-18 01:05 by jv9, 2145 阅读, 3 评论, 收藏, ...

  9. SEED实验系列文章目录

    美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...

随机推荐

  1. input file 在开发中遇到的问题 类似ajax form表单提交 input file中的文件

    最近在做项目的过程中遇到个问题,在这里做个记录防止日后忘记 现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台,供后台处理,可是开发中由于某些原因又不得不用ajax提交文件, 为 ...

  2. Jquery中$.ajax()方法参数详解(转)

    转自:http://blog.sina.com.cn/doctor830619 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数, ...

  3. 用二进制方法求两个整数的最大公约数(GCD)

    二进制GCD算法基本原理是: 先用移位的方式对两个数除2,直到两个数不同时为偶数.然后将剩下的偶数(如果有的话)做同样的操作,这样做的原因是如果u和v中u为偶数,v为奇数,则有gcd(u,v)=gcd ...

  4. POJ2395 最小生成树 - Prime算法

    题目: Out of Hay Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Description The ...

  5. 04-IOSCore - User Defaults、Archive、存储总结

    一. User Defaults 1. 是什么? 是一个特殊的plist文件 2. 干什么? 用于保存应用的配置信息 3. 存什么信息? 信息:欢迎界面有没有被打开过 目的:欢迎界面只显示一次 信息: ...

  6. 某网站经纬度Decode

    <script type="text/javascript">$pi={"cid":2,"cn":"beijing&q ...

  7. MUI AJAX Raw请求数据

    提交接口数据,接口方提供的是post请求,body - raw ; 我尝试过JQuery ajax raw 的方式,但是始终无法成功 然后我回想到我用的是mui我就开始考虑用mui.ajax结果就成功 ...

  8. splinter python浏览器自动化操作,模拟浏览器的行为

    Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果   最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...

  9. 基于visual Studio2013解决C语言竞赛题之0907删除记录

       题目

  10. Linux中处理需要传输的IP报文流程

    本文主要讲解了Linux中处理需要传输的IP报文流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linux中处理需要传输的IP报文流程进行了讲解,希望可以对 ...