Есть ли способ реагировать на изменение системных цветов во время разработки? - PullRequest
0 голосов
/ 04 мая 2011

У меня есть пользовательский контроль (производный от ContainerControl), который я заполняю, используя градиент.Первый цвет градиента может быть или не быть системным цветом, таким как SystemColors.Highlight.Второй цвет градиента получен из первого с помощью ControlPaint.Light(firstColor) или чего-то подобного.

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

Я могу сбросить настройкивторой цвет вручную, поскольку я предоставляю методы ShouldSerialize и Reset для второго свойства цвета, и поэтому значение по умолчанию для этого свойства изменяется соответственно при изменении системного цвета.

Итак, есть ли способ пойматьизменение цвета системы во время разработки?

Редактировать:

Вот пример минимизированного кода:

public class Test : ContainerControl
{

public Test()
{
  ResetColor1();
  ResetColor2();
}

private bool _resetColor2;


// Color 1 stuff
private Color _color1 = Color.Empty;
public System.Drawing.Color Color1
{
  get { return _color1; }
  set
  {
    _resetColor2 = !ShouldSerializeColor2();
    _color1 = value;
    if (_resetColor2)
      ResetColor2();
    Invalidate();
  }
}
// Defaults Color 1
private Color DefaultColor1 { get { return SystemColors.Highlight; } }
public bool ShouldSerializeColor1()
{
  return !Color1.Equals(Color.Empty) && !Color1.Equals(DefaultColor1);
}
public void ResetColor1()
{
  Color1 = DefaultColor1;
}

// Color 2 stuff
private Color _color2 = Color.Empty;
public System.Drawing.Color Color2
{
  get { return _color2; }
  set
  {
    _color2 = value;
    Invalidate();
  }
}
private Color DefaultColor2 { get { return ControlPaint.Light(Color1); } }
public bool ShouldSerializeColor2()
{
  return !Color2.Equals(DefaultColor2);
}
public void ResetColor2()
{
  Color2 = DefaultColor2;
}

protected override void OnPaint(PaintEventArgs e)
{
  base.OnPaint(e);
  using (LinearGradientBrush b = new LinearGradientBrush(ClientRectangle, Color1, Color2, LinearGradientMode.ForwardDiagonal))
    e.Graphics.FillRectangle(b, this.ClientRectangle);
}

protected override void OnSystemColorsChanged(EventArgs e)
{
  base.OnSystemColorsChanged(e);

  if (_resetColor2)
    ResetColor2();
}
}

Если вы поместите этот элемент управления в формуэтот код выполняет следующие действия:

  • По умолчанию Color1 для SystemColors. Highlight

  • По умолчанию Color2 до более светлого цвета

  • Если Color2 не изменяется вручную, он будет автоматически получен из Color1

  • Если системные цвета изменятся во время выполнения, Color1 и Color2 оба изменятся

  • Если системные цвета меняются во время разработки, только Color1 изменится

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Я не был бы слишком удивлен, если событие подавлено в режиме разработки, SystemEvents хитры, потому что они являются статическими событиями. Решите вашу проблему, установив флаг bool в настройщике свойств для Color2, чтобы указать, что он соответствует цвету по умолчанию. Всегда используйте ControlPaint.Light (), когда флаг установлен.

1 голос
/ 04 мая 2011

Вы можете подписаться на событие SystemEvents.DisplaySettingsChanged , я полагаю.

...