Comment accéder hérité des contrôles dans les winforms designer
Je suis en train de faire certains contrôles qui ont tous de partager la même apparence et leur comportement, même s'ils sont conçus pour différents types d'entrées. J'ai donc fait un BaseClass qui héritent de UserControl, et tous mes contrôles hériter de BaseClass.
Cependant, si j'ai ajouter des contrôles pour BaseClass dans le concepteur, tels que un TableLayoutPanel, je ne peux pas y accéder quand je suis à la conception de l'héritage de classes. Je vois le TableLayoutPanel, mais même s'il est "protégé", je ne peux pas le modifier ou mettre des contrôles par le concepteur. J'ai pas de difficultés d'accès aux par le code, mais je ne veux pas perdre la possibilité d'utiliser le concepteur.
Maintenant, j'ai tout simplement supprimé tous les contrôles de BaseClass, a ajouté la mise en page et tous les contrôles communs dans chaque de la classe héritée, puis utiliser des références pour les manipuler à l'intérieur de BaseClass. Mais cela ne me satisfont pas du tout. Est-il un moyen de rendre le concepteur de travail qui ont hérité d'un membre protégé contrôles ?
Environnement : C#, .NET 3.5, Visual Studio 2008
MODIFIER pour répondre à SLaks de la suggestion. J'ai essayé la définition d'une propriété, et bien que je n'ai pas l'habitude de les utiliser, il 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();
}
}
Bien sûr, vous pouvez toujours créer votre propre contrôle hérité de winforms de contrôle. J'ai fait cela pour mettre en œuvre des contrôles. Mais ce n'est pas ce que je suis en train de réaliser ici. Je suis d'essayer d'avoir un contrôle avec plusieurs contrôles de base à l'intérieur : un tablelayoutpanel, avec certains contrôles (comme une étiquette), et de plusieurs espaces vides, les classes héritées doit remplir avec les contrôles de leur choix. L'objectif final consiste à ajouter tous ces contrôles de la boîte à outils, puis drap et de les déposer dans le concepteur de créer des formes qui ont beaucoup de contrôle, mais d'un comportement commun/mise en page à travers les thèses de contrôles.
Et btw, héritant d'un contrôle Winform coupera le concepteur, car, généralement, le point est seulement de mettre en œuvre un comportement spécifique, pas de refonte du contrôle de vous-même.
OriginalL'auteur Ksempac | 2009-06-25
Vous devez vous connecter pour publier un commentaire.
Lorsque vous essayez d'accéder à partir de l'héritage de contrôle avec le concepteur de la TableLayoutPanel déclaré dans la base de contrôle, vous êtes en utilisant une fonction dans WinForms appelé "l'Héritage Visuel".
Malheureusement TableLayoutPanel ne prend pas en charge l'héritage visuel:
http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx
C'est pourquoi la TableLayoutPanel semble bloqué dans le héritée des contrôles.
Oui cela ressemble à une impasse. J'ai été en mesure de trouver la plupart de la source en C# pour tablelayout et le concepteur mais il semble que je ne pourrai jamais trouver les FlowPanelDesigner.uex les fichiers associés à ce contrôle
OriginalL'auteur Ben Arroyo
Essayez d'ajouter cet attribut à la définition du panneau (ce qui peut ou peut ne pas aider):
Essayez de faire le domaine privé, et l'ajout d'attribut à une propriété publique de l'exposer.
C'est ce que SplitContainer n'
Ne semble pas fonctionner, voir modifier pour le post original.
OriginalL'auteur SLaks
Vous devez concevoir la base de contrôles sur leur propre. Les modifications sont répercutées dans le concepteur de fois que vous avez réussi à reconstruire le contrôle du projet. Si vous effectuez les membres du public, vous pouvez les modifier, mais les modifications ne sont pas persister.
Vous ne pouvez pas modifier le contrôle de base lors de la conception de la dérivée de contrôle. Pas facile de toute façon. Si vous avez fait les "espaces vides" public (par exemple, EmptyPanel1, EmptyPanel2,...), à condition que votre propre TypeEditor pour eux, vous pouvez au moins leur permettre de définir les contrôles déficients. La création d'un éditeur de type est un peu de travail même si.
OriginalL'auteur Arnshea
Essayez de faire un
ParentControlDesigner
pour votre contrôle, en remplaçantInternalControlDesigner
, et le retour(designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner)
.designerHost
est(IDesignerHost) component.Site.GetService(typeof(IDesignerHost))
.OriginalL'auteur SLaks
Je me souviens vaguement de la résolution d'un problème similaire en mettant la classe de base son propre de la DLL et la construction de la première. J'ai eu un fouiller mais je ne trouve pas le projet. Désolé.
OriginalL'auteur serialhobbyist