Используйте этот код, например:
<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>
Мы храним предпочтительный файл здесь:
Environment.SpecialFolder.ApplicationData
Сохраните его как xml "предпочтительный" файл, таким образом, не настолько трудно добраться до и изменение, если это когда-нибудь повреждается.
До сих пор это работало намного лучше, чем реестр для нас, это более чисто и легче прорваться, если что-нибудь повреждается или должно быть сброшено.
Мы храним все в Isolation Storage
(мы работаем с ClickOnce). У нас есть некоторый объект, который мы сериализируем (XmlSerializer).
Кажется, теряет популярность по некоторым причинам; но реестр всегда был соответствующим местом для этих видов настроек.
Более быстрый способ сохранить настройки 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 для сохранения его. Этот подход позволяет Вам сделать миграцию от версий до версий. Будучи более мощным, этот метод требует немного большего количества кода.
Мы используем пользовательский SettingsProvider, чтобы хранить информацию конфигурации в таблице в базе данных приложения. Это - хорошее решение, если Вы уже используете базу данных.
В Программировании WPF Chris Sells & Ian Griffiths это говорит
Предпочтительный механизм установки для приложения WPF является тем, обеспеченным.NET и VS: класс ApplicationSettingBase от Системы. Пространство имен конфигурации со встроенным разработчиком.
Копая ответ Аогана и комбинируя его с ответом Декастеляу и постером в блоге, на который он ссылался, вот пример, который заполняет некоторые пробелы, которые не были мне ясны.
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; }
}
}
}