2011-05-04 1 views
0

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

+0

Pouvons-nous voir du code? Je pense que j'ai la raison et la solution, mais je veux être sûr de cela. – Amedio

Répondre

1

Je ne serais pas trop surpris si l'événement est supprimé en mode de conception, SystemEvents sont difficiles car ce sont des événements statiques. Résolvez votre problème en définissant un indicateur bool dans le setter de propriétés pour Color2 pour indiquer qu'il correspond à la couleur par défaut. Utilisez toujours ControlPaint.Light() lorsque l'indicateur est défini.

+0

Vous étiez là, 'SystemEvents.DisplaySettingsChanged' est supprimé. 'SystemEvents.UserPreferenceChanged' semble fonctionner, mais votre approche semble plus facile à gérer. Je vais vérifier les deux approches et ensuite choisir le plus facile. – takrl

1

Vous pouvez vous abonner à l'événement SystemEvents.DisplaySettingsChanged, je crois.

+0

Fermez, merci pour le pointeur. Il semble que 'SystemEvents.UserPreferenceChanged' fonctionne en mode Conception. J'ai besoin de tester ceci maintenant ... – takrl

Questions connexes