Comment accéder aux contrôles hérités dans Winforms Designer

Je fais des contrôles qui doivent tous avoir le même look et un comportement commun, bien qu’ils soient conçus pour différents types d’entrées. J’ai donc créé une BaseClass qui hérite de UserControl et tous mes contrôles héritent de BaseClass.

Cependant, si j’ajoute des contrôles pour BaseClass dans le concepteur, tels que TableLayoutPanel, je ne peux pas y accéder lorsque je conçois les classes héritées. Je vois le TableLayoutPanel, mais même s’il est “protégé”, je ne peux pas le modifier ni y placer de contrôles via le concepteur. Je n’ai aucun problème à y accéder par code, mais je ne veux pas perdre la possibilité d’utiliser le concepteur.

Pour le moment, j’ai simplement supprimé tous les contrôles de BaseClass, ajouté la présentation et tous les contrôles communs dans chacune des classes héritées, puis utilisé des références pour les manipuler dans BaseClass. Mais cela ne me satisfait pas du tout. Existe-t-il un moyen de faire fonctionner le concepteur avec des contrôles de membre protégé hérités?

Environnement: C #, .NET 3.5, Visual Studio 2008

EDIT pour répondre à la suggestion de SLaks. J’ai essayé de définir une propriété et, bien que je ne sois pas habitué à l’utiliser, cela ne semble pas fonctionner. Voici le code que j’ai essayé:

public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public TableLayoutPanel TableLayoutPanel1 { get { return tableLayoutPanel1;} set { tableLayoutPanel1 = value;} } } public partial class UserControl2 : UserControl1 { public UserControl2() { InitializeComponent(); } } 

Lorsque vous essayez d’accéder depuis le contrôle hérité avec le concepteur au TableLayoutPanel déclaré dans le contrôle de base, vous utilisez une fonctionnalité dans WinForms appelée “Inhérence visuelle”.

Malheureusement, TableLayoutPanel ne prend pas en charge l’inheritance visuel: http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

C’est pourquoi TableLayoutPanel apparaît bloqué dans les contrôles hérités.

Essayez d’append cet atsortingbut à la définition du panneau (cela peut aider ou non):

 [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 

Vous devez concevoir les contrôles de base par eux-mêmes. Les modifications sont reflétées dans le concepteur une fois que vous avez reconstruit avec succès le projet de contrôles. Si vous rendez les membres publics, vous pouvez les modifier, mais les modifications ne persisteront pas.

Essayez de créer un ParentControlDesigner pour votre contrôle, en remplaçant InternalControlDesigner et en renvoyant (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner) . designerHost est (IDesignerHost) component.Site.GetService(typeof(IDesignerHost)) . (IDesignerHost) component.Site.GetService(typeof(IDesignerHost)) .

Je me souviens vaguement avoir résolu un problème similaire en mettant la classe de base dans sa propre DLL et en la construisant en premier. J’ai fouillé mais je ne trouve pas le projet. Pardon.