合約:合約就像一個(gè)或多個(gè)程序之間的協(xié)議。合約定義了應(yīng)用程序在與其它程序或Windows 進(jìn)行交互時(shí)必須遵循的一些約定。我們對(duì)一個(gè)應(yīng)用的一些設(shè)置,常用的可以放到AppBar上面,如果不是很常用的,比如應(yīng)用程序的主題顏色,可以放到設(shè)置合約,也就是通過超級(jí)菜單調(diào)出來的設(shè)置面板上。下面就介紹如何把我們的設(shè)置選項(xiàng)添加的設(shè)置面板中。
1.引入命名空間:Windows.UI.ApplicationSettings;
2.注冊(cè)設(shè)置事件
在程序啟動(dòng)的時(shí)候,App.xaml.cs文件中有一個(gè)名為OnLaunched的方法會(huì)被調(diào)用。在OnLaunched的開頭,我創(chuàng)建了一個(gè)event handler,當(dāng)用戶打開SettingsPane時(shí),會(huì)被調(diào)用。你自定義的設(shè)置畫面直到用戶打開Settings Charm時(shí),才會(huì)被加載。當(dāng)你“暫停”你的程序或者游戲,如果設(shè)置面板被打開了,那么這個(gè)event也會(huì)被調(diào)用。
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
SettingsPane.GetForCurrentView().CommandsRequested += App_CommandsRequested; //注冊(cè)設(shè)置事件
Frame rootFrame = Window.Current.Content as Frame;/p>
p> // 不要在窗口已包含內(nèi)容時(shí)重復(fù)應(yīng)用程序初始化,
// 只需確保窗口處于活動(dòng)狀態(tài)
if (rootFrame == null)
{
// 創(chuàng)建要充當(dāng)導(dǎo)航上下文的框架,并導(dǎo)航到第一頁
rootFrame = new Frame();/p>
p> if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: 從之前掛起的應(yīng)用程序加載狀態(tài)
}/p>
p> // 將框架放在當(dāng)前窗口中
Window.Current.Content = rootFrame;
}/p>
p> if (rootFrame.Content == null)
{
// 當(dāng)未還原導(dǎo)航堆棧時(shí),導(dǎo)航到第一頁,
// 并通過將所需信息作為導(dǎo)航參數(shù)傳入來配置
// 參數(shù)
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
// 確保當(dāng)前窗口處于活動(dòng)狀態(tài)
Window.Current.Activate();
}
void App_CommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)
{
SettingsCommand cmd = new SettingsCommand("關(guān)于", "關(guān)于應(yīng)用", (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);
}
如上代碼所示,我創(chuàng)建了一個(gè)SettingsCommand對(duì)象,并提供了三個(gè)值。除非你需要在程序運(yùn)行時(shí)修改SettingsPane,否則第一個(gè)參數(shù)值并不太重要。它就是一個(gè)簡單ID,隨后可以通過這個(gè)ID可以引用到SettingsCommand。標(biāo)簽“主題顏色”可以是任意的字符串,不過我建議不要超過40個(gè)字符,否則會(huì)被截?cái)?。最后一個(gè)參數(shù)值是這個(gè)command的handler。當(dāng)用戶輕觸lable 時(shí),會(huì)執(zhí)行該handler。在這里,我用lambada 表達(dá)式來簡化該處理。表達(dá)式里面,我創(chuàng)建了一個(gè)Popup控件,并將其IsOpen 屬性設(shè)置為true。改變這個(gè)屬性,可以使Popup顯示在屏幕上。
3. 創(chuàng)建Popup控件
首先是一個(gè)自定義的UserControl,之后我會(huì)介紹到該UserControl,現(xiàn)在只需要明白AboutPage.xaml是一個(gè)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(如應(yīng)用程序欄)的邊緣轉(zhuǎn)換位置。
{
Edge = (SettingsPane.Edge == SettingsEdgeLocation.Right) ?
EdgeTransitionLocation.Right :
EdgeTransitionLocation.Left
});//檢查SettingsPane的edge,有些國家的超級(jí)菜單在左邊。/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);//設(shè)置距離左邊的邊距
p.SetValue(Canvas.TopProperty, 0);
return p;
}
}
上面定義了UserControl的高度和寬度,并將element賦值給Popup控件p。(這里建議的寬度是346或者646,高度應(yīng)該是用戶屏幕的完整高度,參考:設(shè)計(jì)指南)。最后,設(shè)置了popup的left 和top 屬性,這樣popup將會(huì)出現(xiàn)在適當(dāng)?shù)奈恢茫缓髮返回給SettingsCommand。
注解:Windows 8可以根據(jù)機(jī)器的本地化設(shè)置而有不同的變化。如果有的國家的語言是從右往左讀的,那么Charms Bar的實(shí)際位置是在屏幕的左邊,而不是右
邊。這就是為什么我在給popup的LeftProperty賦值時(shí),檢查SettingsPane的“edge”。
4. 創(chuàng)建UserControl
添加一個(gè)新的UserControl項(xiàng)到工程中。為了跟之前的代碼想匹配,我將其命名為AboutPage.xaml。這個(gè)文件中代碼的內(nèi)容完全取決于你。沒有任何的官方文檔約束。在UserControl中,可以通過在MainPage中定義一個(gè)共有字段public static MainPage Current來訪問MainPage頁面中控件,實(shí)現(xiàn)對(duì)頁面里面控件的屬性進(jìn)行修改。
如需源代碼,點(diǎn)擊SettingPanel_jb51net.zip下載