NavigationViewを使う2(画面遷移時にPageのインスタンスを使いまわす)

もくじ
https://tera1707.com/entry/2022/02/06/144447#WinUI3

やりたいこと

前回の記事NavigationViewを使って、WinUI3アプリの画面遷移を作った。 画面遷移ができたのはよいのだが、遷移するたびに、その画面のPageインスタンスが新しく作成されてるように見える。

例えば、前回作成したPageの中のLoadedイベントで、

        private int ctr = 0;

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("Page1 Loaded,");
            count.Text = ctr++.ToString();
        }

という感じでクラスのフィールドをカウントUPさせてみると、一度別画面に行って戻ってくると、またctrの値が0に戻っている。
これを、毎回0に戻らないようにしたい。つまり、Pageのインスタンスを毎回使わず、インスタンスを使いまわしたい。
(イメージは、WPFのprismのKeepAlive=trueで画面遷移したときの感じ)

やり方

PageNavigationCacheModeの値をRequiredもしくはEnabledにする。

下記のようにすると、別ページに遷移した後戻ってきても、ctrが0に戻ることはない。

<Page
    x:Class="App3.BlankPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App3"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    NavigationCacheMode="Required"  ★★←コレ
    Loaded="Page_Loaded">

    <StackPanel>
        <Button Content="goto Page2" Width="100" Height="100" Click="Button_Click"/>
        <TextBlock Name="count"  Text="0"/>
    </StackPanel>
</Page>

参考

stackoverflow.com