Я придумал это решение:
- В приложении Settings.settings я определил переменную ConfigurationBase (с типом = строка Область = Приложение)
- Я ввел переменную в целевые атрибуты в Settings.settings, все эти атрибуты должны были быть установлены в Scope = User
- В app.xaml.cs я зачитываю значение, если ConfigurationBase
- В app.xaml.cs я заменил все переменные значением ConfigurationBase. Чтобы заменить значения во время выполнения, атрибуты должны были быть установлены в Scopr = User
Я не очень доволен этим решением, потому что мне приходится менять все атрибуты вручную, если я добавляю новый, я должен учитывать его в app.xaml.cs.
Вот фрагмент кода из App.xaml.cs:
string configBase = Settings.Default.ConfigurationBase;
Settings.Default.CommonOutput_Directory = Settings.Default.CommonOutput_Directory.Replace("${ConfigurationBase}", configBase);
UPDATE
Только что найдено улучшение (снова фрагмент кода из app.xaml.cs):
string configBase = Settings.Default.ConfigurationBase;
foreach (SettingsProperty settingsProperty in Settings.Default.Properties)
{
if (!settingsProperty.IsReadOnly && settings.Default[settingsProperty.Name] is string)
{
Settings.Default[settingsProperty.Name] = ((string)Settings.Default[settingsProperty.Name]).Replace("${ConfigurationBase}", configBase);
}
}
Теперь замены работают для всех атрибутов в моих настройках, которые имеют Type = string и Scope = User. Думаю, мне так нравится.
UPDATE2
Видимо, установка Scope = Приложение не требуется при работе со свойствами.