一尘不染

如何获得Visual Studio 2008 Windows窗体设计器来呈现实现抽象基类的窗体?

c#

我遇到了Windows窗体中的继承控件问题,并且需要一些建议。

我确实对列表(由面板制成的自制GUI列表)中的项目使用基类,并为每种可以添加到列表中的数据类型使用了一些继承的控件。

没问题,但是我现在发现,使基本控件成为抽象类是正确的,因为它具有方法,需要在所有继承的控件中实现这些方法,这些控件是从内部代码中调用的。 base-
control,但一定不能也不能在基类中实现。

当我将基本控件标记为抽象时,Visual Studio 2008设计器拒绝加载窗口。

有没有一种方法可以使Designer与抽象的基本控件一起工作?


阅读 277

收藏
2020-05-19

共1个答案

一尘不染

我知道必须有一种方法可以做到这一点(而且我找到了一种干净利落的方法)。Sheng的解决方案正是我作为临时解决方案提出的,但是在一位朋友指出Form该类最终从一个abstract类继承之后,我们应该能够完成此工作。如果他们能做到,我们就可以做到。

我们从这段代码转到了问题

Form1 : Form

问题

public class Form1 : BaseForm
...
public abstract class BaseForm : Form

这是最初的问题起作用的地方。如前所述,一位朋友指出System.Windows.Forms.Form实现了抽象的基类。我们能够找到…

更好的解决方案的证明

据此,我们知道设计人员可以显示实现基本抽象类的类,而不能显示立即实现基本抽象类的设计器类。中间最多必须有5个,但是我们测试了1个抽象层,最初提出了这个解决方案。

初始解决方案

public class Form1 : MiddleClass
...
public class MiddleClass : BaseForm
... 
public abstract class BaseForm : Form
...

这实际上可以正常工作,并且设计器可以很好地解决问题。…除了您的生产应用程序中有一个额外的继承级别,这仅是由于winforms设计器的不足才有必要!

这不是100%surefire解决方案,但它相当不错。基本上,您通常会使用#if DEBUG经过改进的解决方案。

精制解决方案

Form1.cs

#if DEBUG
public class Form1 : MiddleClass
#else 
public class Form1 : BaseForm
#endif
...

MiddleClass.cs

public class MiddleClass : BaseForm
...

BaseForm.cs

public abstract class BaseForm : Form
...

如果它处于调试模式,则仅使用“初始解决方案”中概述的解决方案。这个想法是,您将永远不会通过调试版本释放生产模式,并且您将始终以调试模式进行设计。

设计器将始终以当前模式下构建的代码运行,因此您不能在发布模式下使用设计器。但是,只要您在调试模式下进行设计并释放在发布模式下构建的代码,您就可以开始使用。

唯一的安全解决方案是您是否可以通过预处理程序指令测试设计模式。

2020-05-19