Настройки приложения .NET: создать массив значений цвета - PullRequest
1 голос
/ 15 июля 2011

Обычно вы можете создать массив в настройках приложения, изменив тип данных вручную в коде. Тем не менее, System.Drawing.Color представляется исключением. Вы можете добавить его в код как обычно, и он даже позволяет редактировать значения в графическом редакторе, как и другие настройки. Кажется, существует проблема с сериализацией данных, поскольку они впоследствии теряются.

Затем я искал методы в коде, думая, что редактор где-то содержит ошибку, поэтому попробовал это в файле настроек:

<Setting Name="ChannelColour" Type="System.Drawing.Color[]" Scope="User">
  <Value Profile="(Default)"><?xml version="1.0" encoding="utf-16"?>
    <ArrayOfColor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <color>Cyan</color>
      <color>DarkOrange</color>
      <color>Magenta</color>
      <color>LawnGreen</color>
    </ArrayOfColor>
  </Value>
</Setting>

И также в app.config:

<setting name="ChannelColour" serializeAs="Xml">
  <value>
    <ArrayOfColor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <color>Cyan</color>
      <color>DarkOrange</color>
      <color>Magenta</color>
      <color>LawnGreen</color>
    </ArrayOfColor>
  </value>
</setting>

Затем я не трогал редактор и убедился, что все существующие конфигурационные файлы исчезли. Это все еще не сработало.

Почему другие массивы работают нормально, и значения Color сами по себе являются одним из параметров по умолчанию, но комбинация вообще не работает?

1 Ответ

1 голос
/ 21 июля 2011

В итоге я сделал это так:

Сначала я добавил класс с именем ColorCollection, который в основном был обёрткой вокруг Color[] с единственным основным отличием (обработка событий).

Добавил свойство в класс «Настройки» для ColorCollection, а затем сохранил настройки как коллекцию StringCollection, которую я установил вручную, используя загрузку параметров и сохраняя обработчики событий, используя методы, добавленные / перегруженные в ColorCollection (ToString и Parse).

Поскольку изменение и подстрочный индекс массива не вызывают событие PropertyChanged, я затем добавил новое событие с именем Changed, которое может вызываться другими классами (PropertyChanged определен в другом классе, поэтому мы не можем вручную вызывайте его даже из класса Settings. Затем я добавил триггер события в оператор set.

Это грязно, но, по крайней мере, есть некоторый уровень абстракции, поэтому грязь не сразу видна. Я закончил тем, что делал что-то подобное для большинства массивов, которые мне были нужны в настройках, так как мне нужно было запускать события, если изменился индекс.

...