Template Studio for WPFで、Prismのサンプルをつくる

## この記事は

[C# Japan - Discord](https://discord.gg/chrgHVjbHG)にて、**Visual Studio 2022でもPrismのテンプレートが使える**と知った！

この記事は、実際にプロジェクトをつくってみたまでの話

## Visual Studio 2022 拡張機能

メニュー > 拡張機能 > 拡張機能の管理

Visual Studio Marketplaceで検索

WPF用のTemplate Studioをダウンロード、インストールする

![install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/34fcac7a-e6e0-e5fb-0feb-8e5861320e20.png)

Visual Studioを再起動すると、`Template Studio for WPF`が選べるようになっている

![template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/250676f7-aa43-23fe-9839-e3cb64cfa65f.png)

（拡張機能をいろいろ漁っていたら、気分転換によさそうなテーマカラーを見つけたので、衣替えした）

## プロジェクトをつくる

アラカルト的に基本レイアウトやテストフレームワークを選べる

- プロジェクトの種類
  - ナビゲーションパネル
  - メニューバー
  - リボン
- **デザインパターン**
  - [MVVM Toolkit](https://github.com/CommunityToolkit/WindowsCommunityToolkit)
  - [Prism](https://github.com/PrismLibrary/Prism)
  - コードビハインド（従来型のモデル）
- ページ
  - ウェブビュー
  - リスト
  - グリッド
- テスト
  - [MSTest](https://github.com/microsoft/testfx)
  - [NUnit](https://github.com/nunit)
  - [xUnit](https://github.com/xunit/xunit)

![create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/698d6c37-0955-3f85-4e43-377c9f255993.png)

ナビゲーションとリストの組み合わせでつくった

こんなに選択肢があると思わなかった・・・

## プロジェクトの構造

できあがったプロジェクト
ターゲットは`.NET6`になっている

`TODO`が6個書いてあるので、その箇所を変更するっぽい

Prism Full Appプロジェクトテンプレート[^1]では`Modules`と`Services`フォルダーにプロジェクトが配置さていたので、そこが違う
そもそもモジュールは使われていないようで、`ConfigureModuleCatalog`などは別途追加する必要がありそう

[^1]:[Prism の Prism Full App (.NET Core) テンプレートを見てみよう](https://qiita.com/okazuki/items/cfbf5c9eaea6c5aed4e1)

![first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/096c2cbd-7ee4-48c0-f990-63ebbe3587ee.png)

`F5`で実行してみた結果

![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e3adcc3a-44bf-3e28-c90c-0ee5fea8267d.gif)

## `App.xaml.cs`

`protected`メソッドはおなじみ

インスタンス変数が`_`始まりであるのが、親近感がもてる

ASP.NETよろしく`appsettings.json`で構成をスイッチする

```csharp
public partial class App : PrismApplication
{
    private string[] _startUpArgs;

    public App() { }

    protected override Window CreateShell() => Container.Resolve<ShellWindow>();

    protected override async void OnInitialized()
    {
        base.OnInitialized();
        await Task.CompletedTask;
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        _startUpArgs = e.Args;
        base.OnStartup(e);
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // Core Services

        // App Services
        containerRegistry.Register<ISampleDataService, SampleDataService>();

        // Views
        containerRegistry.RegisterForNavigation<ListDetailsPage, ListDetailsViewModel>(PageKeys.ListDetails);
        containerRegistry.RegisterForNavigation<MainPage, MainViewModel>(PageKeys.Main);
        containerRegistry.RegisterForNavigation<ShellWindow, ShellViewModel>();

        // Configuration
        var configuration = BuildConfiguration();
        var appConfig = configuration
            .GetSection(nameof(AppConfig))
            .Get<AppConfig>();

        // Register configurations to IoC
        containerRegistry.RegisterInstance<IConfiguration>(configuration);
        containerRegistry.RegisterInstance<AppConfig>(appConfig);
    }

    private IConfiguration BuildConfiguration()
    {
        var appLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        return new ConfigurationBuilder()
            .SetBasePath(appLocation)
            .AddJsonFile("appsettings.json")
            .AddCommandLine(_startUpArgs)
            .Build();
    }

    private void OnExit(object sender, ExitEventArgs e) { }

    private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        // TODO: Please log and handle the exception as appropriate to your scenario
        // For more info see https://docs.microsoft.com/dotnet/api/system.windows.application.dispatcherunhandledexception?view=netcore-3.0
    }
}
```

## おわり

これは深堀りしがいがある。。。

## 参考

- [WPF に対応した Windows Template Studio](https://elf-mission.net/programming/wpf/off-topic/windows-template-studio/)