Сохранение изменений, внесенных в свойство backcolor - PullRequest
0 голосов
/ 12 июля 2009

Я занимаюсь разработкой приложения для Windows.

У меня есть 3 формы:

Я хочу изменить цвет всех трех форм на цвет, выбранный пользователем.

Я использовал следующий код, я могу изменить цвет фона, но когда я выхожу из приложения и перезапускаю его, я не могу получить цвет, который установил пользователь. Я получаю только цвет по умолчанию.

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

код

В форме1

ColorDialog c1 = new ColorDialog();

   public static System.Drawing.Color bkc;
    private void button1_Click(object sender, EventArgs e)
    {

        DialogResult res = c1.ShowDialog();
        if (res == DialogResult.OK)
        {
            bkc = c1.Color;
            this.BackColor = bkc;


            MessageBox.Show(Convert.ToString(bkc));
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 obj1 = new Form2();
        obj1.BackColor = bkc;
        obj1.Show();
    }

в форме 2 CODE

    private void button2_Click(object sender, EventArgs e)
    {
        Form3 obj1 = new Form3();
        obj1.Show();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        this.BackColor = Form1.bkc;

    }

В форме 3 CODE

    private void button2_Click(object sender, EventArgs e)
    {
        Form1 obj1 = new Form1();
        obj1.Show();
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        //Form1 obj2 = new Form1();
        this.BackColor = Form1.bkc;
    }

В диалоговом окне «Цвет» я выбираю цвет и нажимаю кнопку «ОК», цвет также изменяется, но при перезапуске приложения я не получаю цвет, заданный с помощью диалогового окна «Цвет». Я хочу сохранить этот параметр, чтобы Пользователь может получить нужный цвет, не сбрасывая его каждый раз, когда выполняется приложение.

Приведенный выше код не генерирует никаких ошибок.

Кто-нибудь может мне помочь в выполнении этой задачи?

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 12 июля 2009

Вам нужно будет сохранить значение где-нибудь, например, Application.exe.config:

    // Open App.Config of executable
    System.Configuration.Configuration config =
     ConfigurationManager.OpenExeConfiguration
                (ConfigurationUserLevel.None);

    // Add an Application Setting.
    config.AppSettings.Settings.Add("BackgroundColour",
                   bkc + " ");

    // Save the changes in App.config file.
    config.Save(ConfigurationSaveMode.Modified);

    // Force a reload of a changed section.
    ConfigurationManager.RefreshSection("appSettings");

Вот пример полного кода C #: Использование System.Configuration.ConfigurationManager Пример

1 голос
/ 12 июля 2009

Предложение об использовании файла конфигурации приложения близко, но есть две проблемы с ним.

Во-первых, все пользователи приложения используют один и тот же файл конфигурации приложения. Если у вас несколько пользователей (скажем, в сети или у разных пользователей на одном компьютере), сохранение предпочтений пользователя в файле конфигурации приложения изменит этот параметр для всех пользователей. Второе, что не так с этим, заключается в том, что при установке по умолчанию в Vista он все равно не будет работать: по умолчанию Vista не предоставляет пользователю права на запись в каталог Program Files, поэтому сохраняются изменения в файле конфигурации приложения. выдаст исключение.

Правильный ответ - использовать пользовательские настройки. Они хранятся в файле пользовательских настроек приложения, который находится в подкаталоге (глубоко вложенном и зависящем от версии ОС) домашнего каталога пользователя. ConfigurationManager загружает эти настройки во время выполнения и позволяет вам обновлять и сохранять их в своем коде. В Visual Studio встроена целая инфраструктура, которая делает это (относительно) простым, и это хорошо, потому что для правильного выполнения этой задачи необходимо написать ужасный код для класса ConfigurationManager. Вот как это работает:

Если вы загляните под Свойства вашего проекта VS, вы увидите элемент с именем Settings.settings. Когда вы дважды щелкните по нему, он покажет вам сетку, которая позволит вам добавить настройки в ваш проект. Вы даете имя параметра, выбираете его тип данных и значение по умолчанию, и, что особенно важно, область действия. Параметр может быть областью приложения, в этом случае его значение будет общим для всех пользователей приложения и будет сохранено в файле конфигурации приложения. Или это может быть пользовательская область, в этом случае каждый пользователь может иметь свое собственное значение для настройки, и настройка будет жить в файле пользовательских настроек.

Когда вы добавляете настройку в эту сетку, VS генерирует код, чтобы сделать настройку доступной для вашего кода. По сути, он создает класс, который предоставляет эти параметры вашему коду в качестве свойств одноэлементного объекта. (Вы можете увидеть этот код, если хотите получить представление о том, что избавляет вас от необходимости делать это самостоятельно; он сохраняется в файле «Settings.Designer.cs», созданном в «Settings.settings» в представлении проекта. Также удобно восстанавливать этот класс каждый раз, когда вы меняете информацию в сетке настроек. После того, как вы создали параметр в сетке настроек, вы можете ссылаться на него в своем коде таким образом:

ctl.BackColor = Properties.Settings.Default.BackColor;

Настройки пользователя могут быть изменены вашим кодом:

Properties.Settings.Default.BackColor = newBackColor;

И вы можете сохранить их в файле пользовательских настроек следующим образом:

Properties.Settings.Default.Save();

Наличие этих настроек в качестве свойств класса полезно по многим причинам. Одним из наиболее важных является то, что, поскольку они являются свойствами (а не, скажем, словарными записями, доступ к которым осуществляется по ключу, как работает большинство кодов, написанных людьми против класса ConfigurationManager), проверка имен во время компиляции вы используете в коде. Вы никогда не получите NullReferenceException во время выполнения, если вы ошиблись в названии параметра; вместо этого вы получите сообщение об ошибке.

Есть несколько тонкостей в использовании пользовательских настроек. Один из менее очевидных: что происходит, когда вы выпускаете новую версию программного обеспечения? Пользовательские настройки хранятся в каталоге, который привязан к номеру версии программы; Если вы выпустите новую версию, файл пользовательских настроек для нее не будет существовать. Как вы удерживаете пользователя от потери всех своих настроек при обновлении вашей программы?

Это также встроено в этот класс Settings; все, что вам нужно сделать, это:

if (Properties.Settings.Default.UpgradeSettings)
{
   Properties.Settings.Default.Upgrade();
   Properties.Settings.Default.UpgradeSettings = false;
}

Это скопирует настройки пользователя из предыдущего выпуска в файл настроек для нового выпуска.

0 голосов
/ 12 июля 2009

Почему вы не создаете событие, которое слушают все три формы, и заставляют их менять цвет фона при прослушивании события «изменение цвета»? И вы можете сохранить цвет в статической переменной, чтобы при загрузке формы можно было установить цвет фона, сохраненный в переменной.

Чтобы экран запомнил настройки цвета, почему бы не сохранить цвет, выбранный в файле пользовательских настроек? Попробуйте функцию «IsolatedStorage», чтобы сохранить файл настроек.

0 голосов
/ 12 июля 2009

Вы делаете это неправильно.

Как приложение запомнит выбранный пользователем цвет фона?
Приложение работает в памяти и отображает выбранный фоновый цвет до его завершения.

Читайте это и продолжайте.

РЕДАКТИРОВАТЬ: Кроме того, неправильно использовать Form1.BackColor в Form2.
Откройте Form1, измените задний цвет, закройте Form1 и откройте Form2, чтобы увидеть, что происходит (вы можете увидеть, что Form1 открывается снова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...