У меня есть пользовательский контроль (производный от 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 изменится