Сохранение цветовой палитры в настройках программы на C#
Пример
фактически
Этот метод работает, но кажется немного неудовлетворительным. Было бы неплохо, если бы настройки могли просто удерживать значения цвета вместо строки, представляющей массив значений.
Есть несколько способов, которыми вы можете приблизиться к идеальным решениям. Во-первых, вы можете создать собственный тип, чтобы обернуть массив Color, а затем создать конвертер типов для сохранения и восстановления значений этого типа. С некоторыми усилиями вы можете получить это для работы, но это достаточно сложно, что я предпочел бы просто придерживаться строки, представляющей массив.
Лучшим решением было бы сделать настройку, содержащую массив Color. К сожалению, это непросто, потому что настройки должны быть сериализованы и десериализованы как строки XML, а Цвет не является сериализуемым. (Я понятия не имею, почему Microsoft не сделала сериализуемым Color сериализуемым. Это было бы легко для них и было бы полезно при многих обстоятельствах.)
Одно из решений, которое фактически работает, - создать параметр, содержащий массив целых чисел, представляющих значения ARGB значений цвета. Это немного лучше, чем единственная строка, содержащая все значения, разделенные запятыми, так что это решение, продемонстрированное в этом примере. Вы также можете найти другие примеры, в которых вы хотите сохранить массив целых чисел в настройке.
Чтобы начать работу, откройте «Обозреватель решений» и дважды щелкните элемент «Свойства». На вкладке «Настройки» создайте параметр Argbs и введите его int.
К сожалению, вкладка настроек не позволит вам выбрать массив int, но система настроек может обрабатывать такой массив, если вы создаете его «вручную». Для этого закройте Свойства и разверните его в обозревателе решений. Затем щелкните правой кнопкой мыши запись Settings.settings, выберите Open With и выберите один из текстовых редакторов, таких как XML Editor. Р>
Найдите определение параметра внутри редактора. Он должен выглядеть примерно так:
0
Просто измените тип параметра на System.Int32 [] и измените его значение по умолчанию на пустое значение. Результат должен выглядеть следующим образом:
Теперь вы можете использовать параметр Args в качестве массива в программе. При запуске программы выполняется следующий код.
// Загрузите цвета. private void LoadColors() { if ((Properties.Settings.Default.Argbs == null) || (Properties.Settings.Default.Argbs.Length == 0)) { // Использовать цвета по умолчанию. Properties.Settings.Default.Argbs = DefaultColors(); } }
Этот код проверяет, установлен ли этот параметр, если он null или массив пуст. В этих случаях он устанавливает значение, равное массиву, возвращаемому методом DefaultColors. (Загрузите пример, чтобы увидеть этот метод.)
Следующий код показывает, как программа рисует цветовую палитру, представленную настройкой.
// Отображение цветов. private void picPalette_Paint(object sender, PaintEventArgs e) { int max_x = PatchWidth * NumCols; int x = 0, y = 0; foreach (int argb in Properties.Settings.Default.Argbs) { Color color = Color.FromArgb(argb); using (SolidBrush br = new SolidBrush(color)) { e.Graphics.FillRectangle(br, x, y, PatchWidth, PatchHeight); } x += PatchWidth + PatchMargin; if (x > max_x) { x = 0; y += PatchHeight + PatchMargin; } } }
Код проходит через массив настроек. Для каждого целочисленного значения оно преобразует это значение в Цвет, использует Цвет для создания кисти, а затем рисует образец кисти.
Следующий код выполняется, когда пользователь нажимает на образец цвета.
// Позвольте пользователю выбрать цвет. private void picPalette_MouseClick(object sender, MouseEventArgs e) { // Посмотрим, какой цвет был нажат. int row = (int)(e.Y / (PatchHeight + PatchMargin)); int col = (int)(e.X / (PatchWidth + PatchMargin)); int index = row * NumCols + col; // Позвольте пользователю выбрать цвет. cdColor.Color = Color.FromArgb( Properties.Settings.Default.Argbs[index]); if (cdColor.ShowDialog() == DialogResult.OK) { // Пользователь нажал ОК. Сохраните выбранный цвет. Properties.Settings.Default.Argbs[index] = cdColor.Color.ToArgb(); picPalette.Refresh(); } }
Этот код показывает, какой образец цвета был нажат, и отображает ColorDialog, чтобы пользователь мог выбрать новый цвет. Если пользователь выбирает цвет и нажимает ОК, код обновляет соответствующую запись в массиве параметров.
Следующий код выполняется, когда форма закрывается.
// Сохранение текущих цветов. private void Form1_FormClosing(object sender, FormClosingEventArgs e) { SaveColors(); } // Сохранение текущих цветов. private void SaveColors() { Properties.Settings.Default.Save(); }
Метод SaveColors вызывает Properties.Settings.Default.Save, чтобы сохранить текущие значения настроек.