2014年9月26日 星期五

整合 Setting 與加入自定 Layout 的設定畫面

在 Windows 8 這個作業系統推出時,整合了搜尋、分享、設定三個入口到 Charms 上面,到了 Windows 8.1 時雖然 Search 的觀念有些調整,但 Setting 方面依然不變,且增加了方便開發者製作自定 Layout 設定頁的方法。

在 Store Apps 上新增 Setting 的支援方式依然不變,但如果是撰寫 Universal Apps 時,就要特別注意 Charms 相關 API 在 Windows Phone 上面是不支援的,必須使用 #if WINDOWS_APP 將程式碼包起來,以下示範如何在 Shared Project 中為應用程式加入設定,我在 App.xaml.cs 中 override OnWindowsCreated 並加入 SettingsPane 的支援,注意因為是寫在 Shared Project 中,所以大多數的程式碼都被包起來以避免編譯器回報 Error。

此處我僅附上加入到 App class 內的程式碼,原先 App class 內的程式碼未列出來的皆不需修改

public sealed partial class App : Application
{
    public App()
    {
        this.InitializeComponent();
        this.Suspending += this.OnSuspending;
    }

    protected override void OnWindowCreated(WindowCreatedEventArgs args)
    {
        base.OnWindowCreated(args);
    #if WINDOWS_APP
        SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
    #endif
    }

    #if WINDOWS_APP
    private void OnCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)
    {
        UICommandInvokedHandler handler = new UICommandInvokedHandler(OnSettingsCommand);

        SettingsCommand command1 = new SettingsCommand("setting1", "Setting 1", handler);
        args.Request.ApplicationCommands.Add(command1);

        SettingsCommand command2 = new SettingsCommand("setting2", "Setting 2", handler);
        args.Request.ApplicationCommands.Add(command2);

        SettingsCommand command3 = new SettingsCommand("setting3", "Setting 3", handler);
        args.Request.ApplicationCommands.Add(command3);

        SettingsCommand command4 = new SettingsCommand("setting4", "Setting 4", handler);
        args.Request.ApplicationCommands.Add(command4);

        SettingsCommand command5 = new SettingsCommand("setting5", "Setting 5", handler);
        args.Request.ApplicationCommands.Add(command5);

        SettingsCommand command6 = new SettingsCommand("setting6", "Setting 6", handler);
        args.Request.ApplicationCommands.Add(command6);

        SettingsCommand command7 = new SettingsCommand("setting7", "Setting 7", handler);
        args.Request.ApplicationCommands.Add(command7);

        SettingsCommand command8 = new SettingsCommand("setting8", "Setting 8", handler);
        args.Request.ApplicationCommands.Add(command8);

        try
        {
            SettingsCommand command9 = new SettingsCommand("setting9", "Setting 9", handler);
            args.Request.ApplicationCommands.Add(command9);
        }
        catch (Exception)
        {
        }
    }

    private void OnSettingsCommand(IUICommand command)
    {
        SettingsCommand settingsCommand = (SettingsCommand)command;
        Debug.WriteLine(String.Format("Id :: {0}, Label :: {1}", settingsCommand.Id, settingsCommand.Label));
    }
    #endif
}

以上程式碼可以注意一下,我在加入第 9 個 SettingsCommand 時使用 try cache 將指令包起來,這是因為 SettingsPane 在加入超過 8 個 SettingsCommand 時執行會發生 Exception,所以記得 SettingsPane 上只是放各設定細項的入口,不是所有細節。

同時可以注意到 SettingsPane 上只能加入字串格式的 Command,如果想要像預設會加入的 Permission 一樣可以開啟內含豐富元件的 SettingsPane 時,得在 OnSettingsCommand Function 內自行將 SettingsPane 關掉並顯示一個寬度為 346 個 pixel 的 Control,這方面在 Store App 上製作並不如 Windows 8 時一樣需要自行撰寫全部的動作,可以使用官方所提供的 SettingsFlyout class 來簡易的達成。




沒有留言:

張貼留言