2025/08/14

Settings.settings

WinUI3でのアプリ作成で、特に何も考えずに当たり前に使い始めてた、まあいわゆるプロジェクトのプロパティをVisual Studioで開くと左の一番下に「設定」って出る奴ね。これ、今のVisual Studio 2022とかでは確かに

「プロジェクト プロパティ経由では実行されなくなりました」とか出るんですよね。それでもWindowsフォームアプリでは使い続けてました。これ、Copilotの説明だと.NETなんかの流れらしく、WinUI3とかでは推奨されないらしい。で、ApplicationData.Current.LocalSettingsが推奨されるって事で本日午前中はこの修正で終わりました😅

まだまだ全然C#も初心者だし、WinUI3とかもそうなんですが、これまでのSettings.settingsに変えて、今後使用するべく

public static class AppSettings
{
    // 🔹 アプリケーション設定のキー
    //
    // 文字列取得・設定の例
    // string dbPath = AppSettings.Get("JVD_DB");
    // AppSettings.Set("Theme", "Light");
    //
    // 整数取得・設定の例(オーバーロード)
    // int retry = AppSettings.GetInt("MaxRetry", 5);
    // AppSettings.Set("MaxRetry", retry + 1);
    //
    // 真偽値取得・設定の例(オーバーロード)
    // bool logging = AppSettings.GetBool("EnableLogging");
    // AppSettings.Set("EnableLogging", !logging);

    // 初期値定義(すべて文字列)
    private static readonly Dictionary<string, string> DefaultSettings = new()
    {
        { "JVD_DB", "JVData.db" },
        { "UserDB", "UserData.db" },
        { "AnalyzeDB", "Analyze.db" }
    };

    private static readonly ApplicationDataContainer _settings = ApplicationData.Current.LocalSettings;

    public static bool IsInitialized => _settings.Values.ContainsKey("Initialized");

    public static void InitializeDefaults()
    {
        if (!IsInitialized)
        {
            foreach (var kvp in DefaultSettings)
                _settings.Values[kvp.Key] = kvp.Value;

            _settings.Values["Initialized"] = true;
        }
    }

    public static void ResetToDefaults()
    {
        foreach (var kvp in DefaultSettings)
            _settings.Values[kvp.Key] = kvp.Value;
    }

    // 🔹 基本型の取得
    public static string Get(string key)
    {
        if (_settings.Values.TryGetValue(key, out var value))
            return value as string ?? DefaultSettings.GetValueOrDefault(key, "");
        else
            return DefaultSettings.GetValueOrDefault(key, "");
    }

    public static void Set(string key, string value)
    {
        _settings.Values[key] = value;
        SettingChanged?.Invoke(key, value);
    }

    // 🔹 型付き取得
    public static int GetInt(string key, int defaultValue = 0)
    {
        var value = Get(key);
        return int.TryParse(value, out var result) ? result : defaultValue;
    }

    public static bool GetBool(string key, bool defaultValue = false)
    {
        var value = Get(key);
        return bool.TryParse(value, out var result) ? result : defaultValue;
    }

    // 🔹 型付き設定(オーバーロード)
    public static void Set(string key, int value) => Set(key, value.ToString());
    public static void Set(string key, bool value) => Set(key, value.ToString());

    // 🔔 設定変更通知(任意)
    public static event Action<string, string>? SettingChanged;

    // 🔹 補助プロパティ
    public static IEnumerable<string> Keys => DefaultSettings.Keys;
    public static IReadOnlyDictionary<string, string> AllDefaults => DefaultSettings;
}

こんな感じでラッパークラスを追加すればってCopilotの提案を素直に受け入れて進めてみてます。

0 件のコメント:

コメントを投稿