かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

UWP版Prismで、ルートがFrameじゃない構成のアプリを作りたい

UWPアプリとかストアアプリって普通はWindow.Current.ContentはFrameになるのが一般的です。 ただ、SplitViewを使ったアプリとかは、SplitViewの右側にFrameを置いて、Window.Current.ContentにはMainPageを置くということをやったりします。自分で作ってるアプリだとApp.xaml.csで色々出来るのですが、Prismを使った場合はPrismApplicationクラスが起動シーケンスを制御するので、好きにはできません。

一応PrismApplicationにはCreateShellというWindow.Current.Contentに設定するものを作るためのメソッドが用意されてるので、それを使えば出来ます。

<Page x:Class="App15.Views.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:App15.Views"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <SplitView x:Name="FrameContainer"
                   x:FieldModifier="public">

        </SplitView>
    </Grid>
</Page>

こんな感じでMainPageを用意しておいてAppクラスで以下のようにします。

using App15.Views;
using Prism.Windows;
using System.Threading.Tasks;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App15
{
    sealed partial class App : PrismApplication
    {
        public App()
        {
            this.InitializeComponent();
        }

        protected override UIElement CreateShell(Frame rootFrame)
        {
            var mainPage = new MainPage();
            mainPage.FrameContainer.Content = rootFrame;
            return mainPage;
        }

        protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
        {
            this.NavigationService.Navigate("Init", null);
            return Task.CompletedTask;
        }
    }
}

これでいい感じにできます。