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

参考書

WinUI3

WinUI3でアプリを作ろうと思ったときのとっかかりによかった。 msdocsに書いてある情報を、体系的に、順番に読みたいな、というときによいかも。(ただし英語)
この本で分からなかった、かゆいところに手が届かなかった部分を私は記事にしてる感じ。

C#①

表紙に書いてある通り、教科書として最適。 これからC#を勉強したいけど、ネットだけで勉強するのは効率が悪いから体系的に学べる本が欲しいときや、 ちょっとC#を勉強してコード書けるようになったけど、もう少し広く深く知りたいなというときによいと思う。
私は仕事で触れるコードを軸に、基本ネットで断片的にC#を学んだので、その知識の隙間を埋めて枝葉を広げるためにとても分かりやすかった。

C#②

C#の文法的に色々できるのは分かったが、いざ実装するときに、わかったことを使ってどう実装すればいいのか?と悩んだときに指針になりそうな本。
「プロパティ等の名前の付け方、どうすればいい?」「情報をクラス外部に見せるときに、プロパティにすべき?メソッドにすべき?」「異常だと判定したいとき、どんなときにどんな例外をスローすべき?」などなど、勉強になる部分が山ほどあった。
私のように「コードは書くけどこれであってるのか自信がない、レビューで指摘されるのが嫌だ、実装時の(心の)よりどころが欲しい」という人に最適。