合約:合約就像一個或多個程式之間的協議。合約定義了應用程式在與其它程式或Windows 進行互動時必須遵循的一些約定。我們對一個應用的一些設定,常用的可以放到AppBar上面,如果不是很常用的,比如應用程式的佈景主題色彩,可以放到設定合約,也就是通過超級菜單調出來的設定面板上。下面就介紹如何把我們的設定選項添加的設定面板中。
1.引入命名空間:Windows.UI.ApplicationSettings;
2.註冊設定事件
在程式啟動的時候,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; // 不要在視窗已包含內容時重複應用程式初始化, // 只需確保視窗處於活動狀態 if (rootFrame == null) { // 建立要充當導航內容相關的架構,並導航到第一頁 rootFrame = new Frame(); if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: 從之前掛起的應用程式載入狀態 } // 將架構放在當前視窗中 Window.Current.Content = rootFrame; } 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控制項
首先是一個自訂的UserControl,之後我會介紹到該UserControl,現在只需要明白AboutPage.xaml是一個UserControl即可,AboutPage.xaml是用於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,有些國家的超級菜單在左邊。 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
添加一個新的UserControl項到工程中。為了跟之前的代碼想匹配,我將其命名為AboutPage.xaml。這個檔案中代碼的內容完全取決於你。沒有任何的官方文檔約束。在UserControl中,可以通過在MainPage中定義一個共有欄位public static MainPage Current來訪問MainPage頁面中控制項,實現對頁面裡面控制項的屬性進行修改。
如需原始碼,點擊SettingPanel.zip下載