【Material Design Themes】設定を保存する

# はじめに
前回までに、`Material Design Themes`を使用しているアプリケーションで、テーマの変更とカラーの変更ができるユーザーコントロール作成の解説を行った。このままでは、切り替えたテーマやカラーの設定が保存されず、次回起動時にはデフォルトの状態に戻ってしまう。
設定の変更時に状態を保存して、次回起動時に保存した設定の状態で起動する方法を説明する。

https://qiita.com/ReCraft/items/a6b118b73e43859bffb3

https://qiita.com/ReCraft/items/29a4490e7ad63484c0b5

# 前提条件
**はじめに**で紹介したユーザーコントロール作成の手順に沿ってアプリケーションを作成していることを前提としています。

# 設定ファイルの追加
ソリューションエクスプローラーのプロジェクトを右クリックして、プロパティを開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562156/e0a542cb-2b40-519c-f9a1-ee87096c1354.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562156/ccd8c37f-1d12-7cae-02cd-e4de6f55d199.png)

設定の項目を開いて、`アプリケーションの設定を作成する/開く`をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562156/c42b9287-7d87-b3fc-0667-8d63a1efe48d.png)

すると、プロジェクトに`Properties\Settings.settings`が追加されます。
その中身を以下のように設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562156/908aa593-e85c-6787-d3c5-a5a8721e6970.png)

# App.xaml
スタートアップでBundledThemeを設定するので、App.xamlで設定不要です。
```diff_xml:App.xaml
<Application
    x:Class="MaterialDesignApps.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MaterialDesignApps"
-   xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    StartupUri="Views\MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
-               <materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="Green" SecondaryColor="LightGreen" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign3.Defaults.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

```

# App.xaml.cs
起動時に保存された設定を読み取るため`OnStartup`をオーバーライドします。
```C#:App.xaml.cs
using MaterialDesignApps.Helpers;
using MaterialDesignApps.Properties;
using MaterialDesignColors;
using MaterialDesignThemes.Wpf;
using System.Windows;

namespace MaterialDesignApps;

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        try
        {
            BaseTheme theme = Enum.Parse<BaseTheme>(Settings.Default.Theme);
            PrimaryColor primary = Enum.Parse<PrimaryColor>(Settings.Default.Primary);
            SecondaryColor secondary = Enum.Parse<SecondaryColor>(Settings.Default.Secondary);
            ThemeHelper.SetBundledTheme(theme, primary, secondary);
        }
        catch
        {
            BaseTheme theme = BaseTheme.Light;
            PrimaryColor primary = PrimaryColor.Orange;
            SecondaryColor secondary = SecondaryColor.Green;
            ThemeHelper.SetBundledTheme(theme, primary, secondary);
        }
        finally
        {
            base.OnStartup(e);
        }

    }
}

```

# ThemeHelper.cs
設定を変更したときにその状態を保存するための記述を追加します。`SetBundoledTheme`を以下のように変更してください。
```C#:Helpers\ThemeHelper.cs
public static void SetBundledTheme(BundledTheme bundledTheme)
{
    Application.Current.Resources.MergedDictionaries.Add(bundledTheme);
    Settings.Default.Theme = bundledTheme.BaseTheme.ToString();
    Settings.Default.Primary = bundledTheme.PrimaryColor.ToString();
    Settings.Default.Secondary = bundledTheme.SecondaryColor.ToString();
    Settings.Default.Save();
}
```

# 起動
アプリを起動して動作を確認してください。

# おわりに
この記事は備忘録として作成しました。
コードの使用によって生じるいかなる損害も、作者は一切責任を負いません。