Windows 8 Store Apps学习(37) 契约: Settings Contract2013-12-06 cnblogs webabcd介绍重新想象 Windows 8 Store Apps 之 契约Settings Contract - 右侧边栏称之为 Charm, 其中的“设置”称之为 Settings Contract示例演示 Settings Contract 的应用Contracts/SettingsContract/Demo.xaml
<Pagex:Class="XamlDemo.Contracts.SettingsContract.Demo"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"><Grid Background="Transparent"><StackPanel Margin="120 0 0 0"><Button Name="btnAddSettings" Content="注册 SettingsPane 的 CommandsRequested 事件" Click="btnAddSettings_Click_1" /><Button Name="btnShowSettings" Content="打开 SettingsPane" Click="btnShowSettings_Click_1" Margin="0 10 0 0" /><TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" Margin="0 10 0 0" /></StackPanel></Grid></Page>
Contracts/SettingsContract/Demo.xaml.cs
/* * Settings Contract - 右侧边栏称之为 Charm,其中的“设置”称之为 Settings Contract ** SettingsPane - 设置面板 * GetForCurrentView() - 获取当前的 SettingsPane * Show() - 打开 SettingsPane * CommandsRequested - 每次打开 SettingsPane 时所触发的事件(两个类型为 SettingsPane 和 SettingsPaneCommandsRequestedEventArgs 的参数) ** UICommandInvokedHandler - 单击设置面板中的设置项时引发的事件的回调函数,是一个委托(一个类型为 IUICommand 的参数,SettingsCommand 实现了此接口) ** SettingsCommand - 设置面板中的设置项 * Id - 设置项的 ID,标识用 * Label - 设置项的名称,显示用 * Invoked - 指定单机设置项后,引发的事件的处理程序 ** SettingsPaneCommandsRequestedEventArgs - CommandsRequested 事件中的事件参数 * Request - 返回 SettingsPaneCommandsRequest 类型的数据 ** SettingsPaneCommandsRequest - 包含了 CommandsRequested 事件中的可用属性 * ApplicationCommands - SettingsCommand 集合 */using System;using Windows.UI.ApplicationSettings;using Windows.UI.Popups;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Controls.Primitives;using Windows.UI.Xaml.Media.Animation;using Windows.UI.Xaml.Navigation;namespace XamlDemo.Contracts.SettingsContract{public sealed partial class Demo : Page{// 弹出自定义的详细设置页时,所用到的弹出框private Popup _settingsPopup = new Popup();// 是否注册了 SettingsPane 的 CommandsRequested 事件private bool _commandsRequestedRegistered = false;public Demo(){this.InitializeComponent();}protected override void OnNavigatedFrom(NavigationEventArgs e){base.OnNavigatedFrom(e);// 离开此页则去掉 CommandsRequested 监听if (this._commandsRequestedRegistered){SettingsPane.GetForCurrentView().CommandsRequested -= onCommandsRequested;_commandsRequestedRegistered = false;}}// 添加设置项,即初始化自定义的设置项private void btnAddSettings_Click_1(object sender, RoutedEventArgs e){if (!_commandsRequestedRegistered){// 注册 SettingsPane 的 CommandsRequested 事件SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;_commandsRequestedRegistered = true;}else{lblMsg.Text += "已经为 SettingsPane 注册了 CommandsRequested 事件";lblMsg.Text += Environment.NewLine;}}// 显示 SettingsPaneprivate void btnShowSettings_Click_1(object sender, RoutedEventArgs e){SettingsPane.Show();}void onCommandsRequested(SettingsPane settingsPane, SettingsPaneCommandsRequestedEventArgs eventArgs){// 初始化 SettingsPane 中的设置项UICommandInvokedHandler handler = new UICommandInvokedHandler(onSettingsCommand);SettingsCommand aboutCommand = new SettingsCommand("about", "关于", handler);eventArgs.Request.ApplicationCommands.Add(aboutCommand);SettingsCommand contactCommand = new SettingsCommand("contactUs", "联系我们", handler);eventArgs.Request.ApplicationCommands.Add(contactCommand);SettingsCommand flyoutCommand = new SettingsCommand("flyout", "弹出一个类“设置”风格的详细设置页", handler);eventArgs.Request.ApplicationCommands.Add(flyoutCommand);}// 响应 SettingsPane 中的各个自定义设置项的命令void onSettingsCommand(IUICommand command){SettingsCommand settingsCommand = (SettingsCommand)command;lblMsg.Text += string.Format("commandId:{0} - label:{1}", settingsCommand.Id.ToString(), settingsCommand.Label);lblMsg.Text += Environment.NewLine;// 通过 SettingsCommand.Id 来判断用户单机了哪个设置项if (settingsCommand.Id.ToString() == "flyout"){// 详细设置页的宽度double settingsPageWidth = 600;// 设置用于携带详细设置页的 Popup 的基本属性_settingsPopup.IsLightDismissEnabled = true;_settingsPopup.Width = settingsPageWidth;_settingsPopup.Height = Window.Current.Bounds.Height;// 为弹出框增加 PaneThemeTransition 的效果_settingsPopup.ChildTransitions = new TransitionCollection();_settingsPopup.ChildTransitions.Add(new PaneThemeTransition(){Edge = EdgeTransitionLocation.Right});// 实例化自定义的详细设置页,并将其放到 Popup 内CustomSettingsPage mySettingsPage = new CustomSettingsPage();mySettingsPage.Width = settingsPageWidth;mySettingsPage.Height = Window.Current.Bounds.Height;_settingsPopup.Child = mySettingsPage;// 指定 Popup 的显示位置_settingsPopup.HorizontalOffset = Window.Current.Bounds.Width - settingsPageWidth;_settingsPopup.VerticalOffset = 0;_settingsPopup.IsOpen = true;}}}}