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の提案を素直に受け入れて進めてみてます。