J'ai un usercontrol (dérivé de ContainerControl) que je remplis en utilisant un dégradé. La première couleur de dégradé peut ou peut ne pas être une couleur de système, comme SystemColors.Highlight
. La deuxième couleur de dégradé est dérivée de la première, au moyen de ControlPaint.Light(firstColor)
ou quelque chose de similaire.Existe-t-il un moyen de répondre à un changement de couleurs du système lors de la conception?
Je peux facilement gérer les changements de couleurs du système lors de l'exécution en remplaçant OnSystemColorsChanged
, et cela fonctionne sans aucun problème. Mais si le contrôle est placé sur un formulaire au moment de la conception, puis que les couleurs du système sont modifiées, la seconde couleur reste la même, probablement parce que OnSystemColorsChanged
n'a pas été appelée au moment du design.
Je peux réinitialiser la deuxième couleur manuellement puisque je fournis des méthodes ShouldSerialize- et Reset- pour la deuxième propriété de couleur, et par conséquent la valeur par défaut pour cette propriété change en conséquence lorsque la couleur du système change.
Alors, y a-t-il un moyen d'intercepter un changement de couleur du système au moment du design?
Edit:
Voici un exemple de code réduit:
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();
}
}
Si vous mettez ce contrôle sur un formulaire, ce code procédez comme suit:
Par défaut Color1 à SystemColors.Highlight
par défaut Couleur2 à une couleur plus claire
Si Couleur2 ne change pas manuellement, il en tirera automatiquement Color1
Si les couleurs système changent lors de l'exécution, Color1 et Couleur2 sera à la fois le changement
Si le système les couleurs changent au moment de la conception, ne Color1 changera
Pouvons-nous voir du code? Je pense que j'ai la raison et la solution, mais je veux être sûr de cela. – Amedio