子类化的表单在Designer视图中无法正常运行(VS 2008)
时间:2020-03-06 14:29:05 来源:igfitidea点击:
我将Form子类化,以包括一些额外的功能,归结为一个List <Image>,它在表单上的一组预定义点中显示。我有以下几点:
public class ButtonForm : Form { public class TitleButton { public TitleButton() { /* does stuff here */ } // there's other stuff too, just thought I should point out there's // a default constructor. } private List<TitleButton> _buttons = new List<TitleButton>(); public List<TitleButton> TitleButtons { get { return _buttons; } set { _buttons = value; } } // Other stuff here }
然后,我要使用的实际表单是ButtonForm的子类,而不是Form的子类。这一切都很好,Designer甚至选择了新属性并将其显示在属性列表中。我认为这会很棒!它显示了集合,我可以在其中添加按钮,然后就可以走了。因此,我打开了集合编辑器,添加了所有对象,然后瞧瞧,坐在设计器中的是我想要的图片的完美视图。
这是开始变得丑陋的地方。由于某种原因,Designer拒绝实际生成代码来创建对象并将其添加到集合中,因此,尽管在"设计"模式下看起来不错,但只要编译并运行它,它便会再次消失并返回平方一。我完全不知道为什么会发生这种情况。如果设计器能够很好地生成它,从而以额外的行为获得我的表单的图片完美视图,那么为什么不能/不将代码生成到实际的代码文件中呢?
解决方案
首先,我们需要从Component继承TitleButton类,以便设计人员知道它是可以通过设计人员生成的代码创建的组件。然后,我们需要指示设计器代码生成器处理集合的内容,而不是集合实例本身。因此,请尝试以下操作...
public class TitleButton : Component { // ... } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public List<TitleButton> TitleButtons { // ... }