2010-07-16 3 views
2

J'ai mon propre contrôle dérivé de Windows.Forms.Control et je vérifie la Parent.BackColor à l'intérieur de la méthode OnHandleCreated(). Lors du desing-time, la propriété Parent renvoie d'abord null, puis - après que le formulaire est complètement chargé - renvoie la fenêtre parent réelle: le formulaire lui-même.Control.Parent = null

Nous devons dessiner une partie du contrôle personnalisé avec la même couleur que l'arrière-plan du formulaire parent: quand pouvons-nous compter sur la valeur Control.Parent?

Merci.

Répondre

2

Vous pouvez utiliser l'événement ParentChanged pour détecter quand cette propriété change et déclencher un redessin (bien qu'un devrait se produire automatiquement). Il y a quelques propriétés, cependant (BackColor et ForeColor étant deux d'entre elles, je crois) qui sont "héritées" du parent si elles ne sont pas explicitement définies, ainsi vous devriez pouvoir les employer aussi bien.

0

vous pouvez utiliser if(this.DesignMode) return; pour déterminer si votre contrôle est en cours de conception et ne pas obtenir d'exception ou pour effectuer des vérifications supplémentaires. Dans Windows Forms, après InitilizeComponents, afaik Control a toujours un parent.

+0

Après 'InitializeComponent' dans le parent, c'est correct. * Not * après 'InitializeComponent' dans le contrôle. –

+0

ouais, c'est ce que je voulais dire, merci :) –

0

Voici une citation du livre de Chris Sells Windows Forms Programmation en C# (p 259.):

Une propriété ambiante est celui qui, si elle est pas définie dans le contrôle, sera " hérité "du conteneur. Parmi toutes les propriétés standard fournies par la classe de base Control, seules quatre sont ambiantes: BackColor, ForeColor, Font et Cursor. [...]     (Souligné par moi.)

cela peut aider à éviter une certaine façon peut-être la dépendance de la propriété Control.Parent ...?


P.S .: En fait, certaines des autres réponses sont probablement plus utiles que le mien: je commence à penser que peut-être, la méthode OnHandleCreated est tout simplement au mauvais endroit pour demander une propriété du parent du contrôle. OnParentChanged ou même OnPaint sont probablement de meilleurs endroits pour cela.

0

En fait, je ne vois pas de problème ici. Parce que si je comprends bien, vous avez besoin de parent pour dessiner quelque chose avec la couleur de retour des parents, et quand vous recevez l'événement Paint de votre contrôle (OnPaint, WM_PAINT) déjà initialisé.