Windows 8 开发之设置合约的介绍 |
本文标签:Windows8,设置合约 合约:合约就像一个或多个程序之间的协议 。合约定义了应用程序在与其它程序或Windows 进行交互时必须遵循的一些约定 。我们对一个应用的一些设置,常用的可以放到AppBar上面,如果不是很常用的,比如应用程序的主题颜色,可以放到设置合约,也就是通过超级菜单调出来的设置面板上 。下面就介绍如何把我们的设置选项添加的设置面板中 。 1.引入命名空间:Windows.UI.ApplicationSettings; 在程序启动的时候,App.xaml.cs文件中有一个名为OnLaunched的方法会被调用 。在OnLaunched的开头,我创建了一个event handler,当用户打开SettingsPane时,会被调用 。你自定义的设置画面直到用户打开Settings Charm时,才会被加载 。当你“暂停”你的程序或者游戏,如果设置面板被打开了,那么这个event也会被调用 。 复制代码 代码如下:protected override void OnLaunched(LaunchActivatedEventArgs args) { SettingsPane.GetForCurrentView().CommandsRequested += App_CommandsRequested; //注册设置事件 Frame rootFrame = Window.Current.Content as Frame;</p> <p> // 不要在窗口已包含内容时重复应用程序初始化, // 只需确保窗口处于活动状态 if (rootFrame == null) { // 创建要充当导航上下文的框架,并导航到第一页 rootFrame = new Frame();</p> <p> if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: 从之前挂起的应用程序加载状态 }</p> <p> // 将框架放在当前窗口中 Window.Current.Content = rootFrame; }</p> <p> if (rootFrame.Content == null) { // 当未还原导航堆栈时,导航到第一页, // 并通过将所需信息作为导航参数传入来配置 // 参数 if (!rootFrame.Navigate(typeof(MainPage), args.Arguments)) { throw new Exception("Failed to create initial page"); } } // 确保当前窗口处于活动状态 Window.Current.Activate(); } 复制代码 代码如下:void App_CommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) { SettingsCommand cmd = new SettingsCommand("关于", "关于应用", (handle) => { Popup popup = CreatePopup.Create(new AboutPage(),346); popup.IsOpen = true; }); SettingsCommand cmd1 = new SettingsCommand("主题", "主题颜色", (handle) => { Popup popup = CreatePopup.Create(new ThemColor(), 346); popup.IsOpen = true; }); args.Request.ApplicationCommands.Add(cmd); args.Request.ApplicationCommands.Add(cmd1); } 如上代码所示,我创建了一个SettingsCommand对象,并提供了三个值 。除非你需要在程序运行时修改SettingsPane,否则第一个参数值并不太重要 。它就是一个简单ID,随后可以通过这个ID可以引用到SettingsCommand 。标签“主题颜色”可以是任意的字符串,不过我建议不要超过40个字符,否则会被截断 。最后一个参数值是这个command的handler 。当用户轻触lable 时,会执行该handler 。在这里,我用lambada 表达式来简化该处理 。表达式里面,我创建了一个Popup控件,并将其IsOpen 属性设置为true 。改变这个属性,可以使Popup显示在屏幕上 。 3. 创建Popup控件 复制代码 代码如下:public class CreatePopup { public static Popup Create(UserControl element, double width) { Popup p = new Popup(); p.Child = element; p.IsLightDismissEnabled = true; p.ChildTransitions = new TransitionCollection(); p.ChildTransitions.Add(new PaneThemeTransition() //声明边缘 UI(如应用程序栏)的边缘转换位置 。 { Edge = (SettingsPane.Edge == SettingsEdgeLocation.Right) ? EdgeTransitionLocation.Right : EdgeTransitionLocation.Left });//检查SettingsPane的edge,有些国家的超级菜单在左边 。</p> <p> element.Width = width; element.Height = Window.Current.Bounds.Height; p.SetValue(Canvas.LeftProperty, SettingsPane.Edge == SettingsEdgeLocation.Right ? (Window.Current.Bounds.Width - width) : 0);//设置距离左边的边距 p.SetValue(Canvas.TopProperty, 0); return p; } } 上面定义了UserControl的高度和宽度,并将element赋值给Popup控件p 。(这里建议的宽度是346或者646,高度应该是用户屏幕的完整高度,参考:设计指南) 。最后,设置了popup的left 和top 属性,这样popup将会出现在适当的位置,然后将p返回给SettingsCommand 。 注解:Windows 8可以根据机器的本地化设置而有不同的变化 。如果有的国家的语言是从右往左读的,那么Charms Bar的实际位置是在屏幕的左边,而不是右 边 。这就是为什么我在给popup的LeftProperty赋值时,检查SettingsPane的“edge” 。 4. 创建UserControl 如需源代码,点击SettingPanel_jb51net.zip下载 |