- 画面遷移の実装の基本を理解する
Xamarin.Formsには2種類の画面遷移があります。
- Hierarchical Navigation(階層ナビゲーション)
- Modal Navigation(モーダル ナビゲーション)
ここでは1.の画面遷移の基本的な利用方法を説明します。
- 新しいPageの追加
- DIコンテナへ新しいPageの登録
MainPageViewModel.cs
に画面遷移処理の追加MainPage.xaml
に画面遷移処理の呼び出しボタンの追加
Viewsフォルダの下に、ContentPageを継承した「ColorsPage.xaml
」という新しいページを追加してください。
標準のXamarinテンプレートで作成すると、次のようなコードが作成されるます(VS for Windows)。
Title
だけ追加でColorsに変更しています。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="PrismHandsOn.Views.ColorsPage"
Title="Colors">
<ContentPage.Content>
<StackLayout>
<Label Text="Welcome to Xamarin.Forms!"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
App.xaml.cs
を開き新しく追加したColorsPage
をDIコンテナへ登録してください。
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<NavigationPage>();
containerRegistry.RegisterForNavigation<MainPage>();
containerRegistry.RegisterForNavigation<ColorsPage>();
}
Prism for Xamarin.Formsでは、画面遷移処理はINavigationService
を利用して行います。
PrismではINavigationService
以外にも、多くのサービスが提供されていますが、基本的にDependency Injectionパターンに則ってサービスは提供されます。このため、サービスのインスタンスはnewするのではなく、外部からコンストラクタで設定してもらう必要があります。
このとき、INavigationServiceのパラメーター名は必ずnavigationServiceである必要がありますので注意してください。
具体的には次のように記述します。
public class MainPageViewModel : BindableBase
{
private readonly INavigationService _navigationService;
...
public MainPageViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
}
}
コンストラクタの引数で受け取り、それをフィールドに保持しているのが見て取れます。
なお、このままではINavigationServiceへの参照が解決できないため、次のusingを追加してください。
using Prism.Navigation;
つづいて、画面処理を実行するCommandを実装しましょう。
public Command<string> NavigateCommand =>
new Command<string>(
name => _navigationService.NavigateAsync(name));
App.xaml.cs
で記述したように、遷移名を指定して画面遷移を行います。この時、遷移名をViewModelに記述してもよいのですが、今回は画面側からCommandのパラメーターとして遷移先を受け渡してもらうよう実装しています。
それでは画面遷移処理の呼び出し箇所を実装します。
MainPage.xaml
を開き、ボタンを追加します。ボタンにはNavigateCommand
と、遷移先名をパラメーターとして設定します。
変更後
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage ...
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="{Binding Message}"/>
<Button Text="Update Message"
Command="{Binding UpdateMessageCommand}"/>
<Button Text="Navigate to ColorsPage"
Command="{Binding NavigateCommand}"
CommandParameter="ColorsPage"/>
</StackLayout>
</ContentPage>
さあ実行してみましょう。ボタンを押下するとColorsページに遷移しします。NavigationPage
の元遷移しているため、遷移後の画面のナビゲーションバーから前の画面に戻れているのが見て取れます。
一つ興味深い振る舞いをしているのが、戻ってきた後の画面に表示されているメッセージです。時刻表示が更新されていることが見て取れるでしょう。
このことから次の事が言えます。
- 画面遷移しても前のViewおよびViewModelのインスタンスは保持されている
- 戻ったタイミングでも
Appearing
イベントは発行される
これはPrismというよりはXamarin.Formsの仕様になります。