Лучшие практики для хранения настроек UI?

Используйте этот код, например:

<input id="counter" type="text" value="1234" size="7" readonly>
<script>
let init="1234";
let i = 5;
setInterval(function() {
     document.getElementById("counter").value=init;
     document.getElementById("counter").size=init.length + 4;
     init += i;
     i++;
},1000);
</script>
11
задан Joachim Kerschbaumer 29 October 2008 в 13:49
поделиться

7 ответов

Мы храним предпочтительный файл здесь:

Environment.SpecialFolder.ApplicationData

Сохраните его как xml "предпочтительный" файл, таким образом, не настолько трудно добраться до и изменение, если это когда-нибудь повреждается.

До сих пор это работало намного лучше, чем реестр для нас, это более чисто и легче прорваться, если что-нибудь повреждается или должно быть сброшено.

13
ответ дан 3 December 2019 в 02:31
поделиться

Мы храним все в Isolation Storage (мы работаем с ClickOnce). У нас есть некоторый объект, который мы сериализируем (XmlSerializer).

2
ответ дан 3 December 2019 в 02:31
поделиться

Кажется, теряет популярность по некоторым причинам; но реестр всегда был соответствующим местом для этих видов настроек.

1
ответ дан 3 December 2019 в 02:31
поделиться

Более быстрый способ сохранить настройки UI использует Свойства. Настройки. Система по умолчанию. То, что может быть любезно с ним, должно использовать WPF, связывающий со значением. Пример здесь. Settins автоматически обновляются и загружаются.

<Window ...
    xmlns:p="clr-namespace:UserSettings.Properties"
    Height="{Binding Source={x:Static p:Settings.Default}, Path=Height, Mode=TwoWay}" 
    Width="{Binding Source={x:Static p:Settings.Default}, Path=Width, Mode=TwoWay}" 
    Left="{Binding Source={x:Static p:Settings.Default}, Path=Left, Mode=TwoWay}" 
    Top="{Binding Source={x:Static p:Settings.Default}, Path=Top, Mode=TwoWay}">

...
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    Settings.Default.Save(); 
    base.OnClosing(e); 
}

Проблема с этим состоит в том, что это, quicky становится путаницей, если Ваше приложение крупно.

Другое решение (предложенный кем-то здесь) состоит в том, чтобы использовать путь ApplicationData для хранения собственных предпочтений в XML. Там можно создать собственный класс установки и использовать сериализатор XML для сохранения его. Этот подход позволяет Вам сделать миграцию от версий до версий. Будучи более мощным, этот метод требует немного большего количества кода.

10
ответ дан 3 December 2019 в 02:31
поделиться

Мы используем пользовательский SettingsProvider, чтобы хранить информацию конфигурации в таблице в базе данных приложения. Это - хорошее решение, если Вы уже используете базу данных.

1
ответ дан 3 December 2019 в 02:31
поделиться

В Программировании WPF Chris Sells & Ian Griffiths это говорит

Предпочтительный механизм установки для приложения WPF является тем, обеспеченным.NET и VS: класс ApplicationSettingBase от Системы. Пространство имен конфигурации со встроенным разработчиком.

1
ответ дан 3 December 2019 в 02:31
поделиться

Копая ответ Аогана и комбинируя его с ответом Декастеляу и постером в блоге, на который он ссылался, вот пример, который заполняет некоторые пробелы, которые не были мне ясны.

xaml файл:

<Window ...
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:MyApp"
    Height="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndHeight, Mode=TwoWay}"
    Width="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndWidth, Mode=TwoWay}"
    Left="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndLeft, Mode=TwoWay}"
    Top="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndTop, Mode=TwoWay}"
    ...

И исходный файл:

namespace MyApp
{
    class MainWindow ....
    {
        ...

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            MyAppSettings.Default.Save();
            base.OnClosing(e);
        }
    }

    public sealed class MyAppSettings : System.Configuration.ApplicationSettingsBase
    {
        private static MyAppSettings defaultInstance = ((MyAppSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new MyAppSettings())));
        public static MyAppSettings Default
        {
            get { return defaultInstance; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("540")]
        public int MainWndHeight
        {
            get { return (int)this["MainWndHeight"]; }
            set { this["MainWndHeight"] = value; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("790")]
        public int MainWndWidth
        {
            get { return (int)this["MainWndWidth"]; }
            set { this["MainWndWidth"] = value; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("300")]
        public int MainWndTop
        {
            get { return (int)this["MainWndTop"]; }
            set { this["MainWndTop"] = value; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("300")]
        public int MainWndLeft
        {
            get { return (int)this["MainWndLeft"]; }
            set { this["MainWndLeft"] = value; }
        }
    }
}
4
ответ дан 3 December 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: