Сохранение настроек приложения
Начиная с версии 2.0 .NET Framework позволяет очень легко создавать, сохранять и загружать настройеи приложения. Довольно часто возникает необходимость в сохранении фонового цвета программы, размеров окна, размеров шрифта чтобы при следующем запуске программы, она сама восстанавливала эти настройки.
Давайте рассмотрим, каким образом можно добавить настройки к приложению. Вызовите контектсное меню проекта (рис. 1) и выберите пункт Poperties (Свойства)
- Name определяет имя настройки, используя которое можно обратиться к нужной настройке из программы;
- Type – тип настройки, это может быть число, строка (string), цвет (system.Color);
- Scope определяет степень доступа к настройке во время выполнения программы. Данное свойство может принимать два значения: Application и User. Настройка на уровне приложения является более важной и влияет на работу программы в целом, в то время как настройка на уровне пользователя больше подходит для, например, удобного оформления цветовых схем и не влиляет на работу приложения в целом;
- Value определяет значение, возвращаемое при обращении к настройке. Значение может принимать тип, определенный свойством Type
Имейте в виду, что пользовательские настройки можно изменять во время выполнения программы, то есть их можно считывать и записывать. Программные настройки доступны только для чтения и изменять их можно только при разработке приложения или путем изменения файла настроек вручную.
Давайте создадим настройки, которые будут отвечать за размер окна приложения, фоновый цвет и настройки шрифта. Для этого добавте следующие настройки:
Name | Type | Scope | Value |
backgroundColor | System.Drawing.Color | User | Control |
FormWidth | int | User | 300 |
FormHeight | int | User | 200 |
FormFont | System.Drawing.Font | User | Microsoft Sans Serif; 8,25pt |
Должно получиться похожее как на рисунке:
private void Form1_Load(object sender, EventArgs e) { //загружаем фоновый цвет this.BackColor = Properties.Settings.Default.BackgrounColor; //загружаем шрифт this.Font = Properties.Settings.Default.FormFont; //загружаем размеры окна this.Width = Properties.Settings.Default.FormWidth; this.Height = Properties.Settings.Default.FormHeight; }
Сразу, как говорится, не отходя от кассы, подпишемся на обработчик события FormClosing и в нем будем сохранять все настройки при закрытии приложения:
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //запись настроек Properties.Settings.Default.BackgrounColor = this.BackColor; Properties.Settings.Default.FormWidth = this.Width; Properties.Settings.Default.FormHeight = this.Height; Properties.Settings.Default.FormFont = this.Font; //сохранение настроек Properties.Settings.Default.Save(); }
Обратите внимание на строчку
//сохранение настроек Properties.Settings.Default.Save();
Метод Save сохраняет настройку в файле настроек. Без использования этого метода, настройки будут работать только в текущей сессии. Сами настройки хранятся в файле App.config который можно посмотреть в Visual Studio (это обычный XML файл с записанными в нем нашими настройками).
Теперь перейдем к форме Настроек. Здесь мы и будем настраивать все наши параметры.
В обработчике события Load загружаем настройки
private void frmSettings_Load(object sender, EventArgs e) { pictureBox1.BackColor = Properties.Settings.Default.BackgrounColor; font = Properties.Settings.Default.FormFont; }
В обработчике события кнопки изменения цвета всё просто:
//кнопка Изменить фоновый цвет private void btnChangeBackgroundColor_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) { pictureBox1.BackColor = colorDialog1.Color; } }
Создадем свойство, с помощью которого будем передавать выбранный цвет в главную форму.
public Color GetColor { get { return pictureBox1.BackColor; } }
С шрифтом аналогичная ситумация.
Font font; private void btnChangeFont_Click(object sender, EventArgs e) { //загружаем текущие настройки шрифта fontDialog1.Font = Properties.Settings.Default.FormFont; if (fontDialog1.ShowDialog() == DialogResult.OK) { font = fontDialog1.Font; } }
Свойство
public Font GetFormFont { get { return font; } }
Осталось только написать код для кнопок ОК и Отмена. Кнопка ОК присваивает значение DialogResult ОК и закрывает форму, а Отмена – просто закрывает форму:
private void btnOk_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.OK; this.Close(); } private void btnCancel_Click(object sender, EventArgs e) { this.Close(); }
С формой настроек мы закончили. Возвращаемся к главной форме из которой мы будем вызывать окно настроек. Делать мы это будем из обработчика события для пункта меню «Настройки»:
private void mnuSettings_Click(object sender, EventArgs e) { //Объявляем екземпляр формы frmSettings frm = new frmSettings(); //если на форме настроек была нажата кнопка ОК, а не Отмена выполняем следующий код if (frm.ShowDialog() == DialogResult.OK) { //присваиваем значение фонового цвета this.BackColor = Properties.Settings.Default.BackgrounColor = frm.GetColor; //присваиваем значение шрифта this.Font = Properties.Settings.Default.FormFont = frm.GetFormFont; //сохраняем настройки Properties.Settings.Default.Save(); } }
Вот и все. Запустите приложение и попробуйте поизменять размеры формы, цвет и настройки шрифта. При последующем открытии формы все сделанные настройки сохраняются.
ApplicationSettings.rar (49,5 KiB, 2 092 закачек)
Спасибо!
Если ShowColor поставить в true то в fontDialog появиться и выбор цвета шрифта, как его сохранять? Отдельно, или можно в System.Drawing.Font ? Пробовал Microsoft Sans Serif; 8,25pt; Black, ругается.
Вроде сделал все по шагам, как в статье написано. Но форма ведет себя как-то своевольно: размеры не запоминаются, при изменении шрифта иногда одновременно изменяются и размеры. При этом скачанный пример работает нормально.
Если всё сделано правильно, то форма запоминает все размеры.
И еще вопрос. Что это за файл появился после запуска (точнее, после закрытия) приложения: C:\Users\user\AppData\Local\ApplicationSettings\ApplicationSettings.vshos_Url_bfayrgknf0asvwm235hzd50t5lz2s2p3\1.0.0.0\user.config? Ручное редактирование этого файла напрямую влияет на поведение приложения, причем user.config имеет приоритет перед app.config, о котором говорится в статье. Может быть в Visual Studio надо где-то явно указать расположение файла настроек?