2014年8月7日 星期四

Store Apps Navigation

在撰寫 Windows Phone 7、8 應用程式時,很習慣使用 NavigationService 來做頁面導覽的工作,而比較 Siliverlight、XAML App 時,會發現基本的導覽觀念差不多,只是寫法不同,在 Universal Apps 的框架下,Windows Phone 的導覽 API 是和 Windows RT 寫法是一致的,比起 Siliverlight 框架,新的 Store Apps 框架上最重要的是多了一個 Frame 的概念。

如果對這些名詞感到混亂,可以先參考:Windows Phone 及 Windows Store 的 API 演進

建立 Universal Apps 後,在 Shared Project 的 App.xaml.cs 內可以看到這段 Code,基本上是用來指定這個應用程式的首頁是哪個 Class。

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;

    if (rootFrame == null)
    {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
    }

    if (rootFrame.Content == null)
    {
        if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
        {
            throw new Exception("Failed to create initial page");
        }
    }

    Window.Current.Activate();
}

這和 Siliverlight for Windows Phone 在 WMAppManifest.xml 利用 DefaultTask 設定應用程式首頁的方式不同,但這個方式增加了更多開發者可以發揮的空間,頁面導覽之間的參數也不再局限字串。我先新增一個名為 NewFramePage 的 Page,並且在 MainPage 中加入兩個 Button 分別做 Page 的導覽及 Frame 的導覽。

底下這段程式碼很簡單,使用 Page 的 Frame 這個 Property 的 Navigate Method 讓這個 Frame 的內容導覽到 NewFramePage 這頁,並且在接下來的參數任意帶一個 Object 傳至新的一頁,在這行執行完畢後會導到 NewFramePage 這頁,按 Back 後會回到 MainPage,再按 Back 即是離開 App,是很直覺的導覽過程。

MainPage -> 
NewFramePage -> 
(Back) -> 
MainPage -> 
(Back) -> 
Exit Application

// 建立一個類別來放需要傳遞的資訊
public class BoundleData
{
    public Object DataA;
    public Object DataB;
}

private void GoPage(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(NewFramePage), new BoundleData());
}

再來另一個按鍵,按下後我 new 一個 Frame 將它指給 Windows.Current.Content 並將這個新的 Frame 導覽至 NewFramePage,產生的結果剛開始看起來是一樣的,頁面的導覽流程由 MainPage 導至 NewFramePage 了,但此時按 Back 卻會發生 Application 被關閉的情況。

MainPage -> 
NewFramePage -> 
(Back) -> 
Exit Application

private void GoFrame(object sender, RoutedEventArgs e)
{
    var newFrame = new Frame();
    Window.Current.Content = newFrame;
    newFrame.Navigate(typeof(NewFramePage), new BoundleData());
}

Frame 的特性可以讓我們用來改寫很多以前用 PopUp 來實現的流程,但如開啟 Application 後進行 Application 的使用導覽數頁,最後再產生新的 Frame 導到 MainPage,讓導覽頁從 Navigation History 中消失。

Store Apps 目前的 UI Guideline 還是以換頁切換 Content 為主,所以 Windows.Current.Content 僅能是一個 Frame,如此架構上還無法以直覺的方式做到同一個 Windows Store App 畫面下,左側是功能清單,點按後右側切換至不同 Page 這種 Android Activity + Fragment 的行為,算是一個蠻可惜的地方。




沒有留言:

張貼留言