Сохранение настроек приложения

Начиная с версии 2.0 .NET Framework позволяет очень легко создавать, сохранять и загружать настройеи приложения. Довольно часто возникает необходимость в сохранении фонового цвета программы, размеров окна, размеров шрифта чтобы при следующем запуске программы, она сама восстанавливала эти настройки.

Давайте рассмотрим, каким образом можно добавить настройки к приложению. Вызовите контектсное меню проекта (рис. 1) и выберите пункт Poperties (Свойства)

Рис. 1 Свойтсва приложения
 
В результате появится окно Свойств. Переходим на влкадку Settings. Именно здесь, мы будем добавлять те параметры, которые захотим хранить. Давайте рассмотрим сами настройки. Они имеют четыре свойтсва – Name (Имя), Type (Тип), Scope (Область видимости) и Value (Значение):

  • 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

Должно получиться похожее как на рисунке:

Рис. 2 Начальные настройки приложения
 
С созданием настроек закончили. Теперь перейдем к проектированию нашего приложения. Я особо не заморачивался и создал простое приложение, которое сосотоит из двух форм: главной и формы настроек(рис. 3 -4). Главная форма имеет MenuStrip c одним пунктом меню Файл и двумя подпунктами Настройки и Выход, и 1 Label свойство AutoSize = false. Форма Настроек имеет GroupBox в котором размещены Label – Фоновый цвет, PictureBox – который будет отображать текущий фоновый цвет и кнопка Изменить. Также есть еще три кнопки Изменить шрифт, ОК, Отмена и два диалога colorDialog1 используется для выбора цвета и fontDialog1 – выбор шрифта.

Рис. 3 Гавная форма приложения

Рис. 4 Форма “Настройки приложения”
 
Перейдем непосредственно к коду программы. Для нашей формы, создадим обработчик события Load. В этом обработчике мы будем загружать все настройки приложения:

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();
   }
}

Вот и все. Запустите приложение и попробуйте поизменять размеры формы, цвет и настройки шрифта. При последующем открытии формы все сделанные настройки сохраняются.

[download id=”5″]

5 Comments

  1. Если ShowColor поставить в true то в fontDialog появиться и выбор цвета шрифта, как его сохранять? Отдельно, или можно в System.Drawing.Font ? Пробовал Microsoft Sans Serif; 8,25pt; Black, ругается.

  2. Вроде сделал все по шагам, как в статье написано. Но форма ведет себя как-то своевольно: размеры не запоминаются, при изменении шрифта иногда одновременно изменяются и размеры. При этом скачанный пример работает нормально.

  3. И еще вопрос. Что это за файл появился после запуска (точнее, после закрытия) приложения: C:\Users\user\AppData\Local\ApplicationSettings\ApplicationSettings.vshos_Url_bfayrgknf0asvwm235hzd50t5lz2s2p3\1.0.0.0\user.config? Ручное редактирование этого файла напрямую влияет на поведение приложения, причем user.config имеет приоритет перед app.config, о котором говорится в статье. Может быть в Visual Studio надо где-то явно указать расположение файла настроек?

Leave a Reply to BestlisCancel Reply

Your email address will not be published. Required fields are marked *

http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_good.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_negative.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_scratch.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wacko.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yahoo.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cool.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_smile.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yes.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cry.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_sad.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_unsure.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wink.gif