我有一个基于另一种标准形式的表单(透明支持表单),它在运行时通过自己的类型标识自己。然而,在设计器中,我设置了一些消息框输出,在设计时显示它在设计器控件堆栈顶部标识为父类型。
示例代码
Public Class SpecificForm
Inherits GenericForm
Implements IUsefulInterface
...
End Class
Public Class GenericForm
Inherits System.Windows.Forms.Form
...
End Class
我在表单上有控件,寻求他们的父母知道如何正确绘制。在运行时它工作正常,因为特定类型实现了一个携带绘图信息的接口。通过父母循环产生
"Control1" As System.Windows.Forms.Control, parented by
"MainForm1" As SpecificForm, parented by
Nothing
作为设计时间,虽然循环通过父母产生
"Control1" As System.Windows.Forms.Control, parented by
"MainForm1" As GenericForm, parented by
"" As System.Windows.Forms.Design.DesignerFrame+OverlayControl, parented by
"" As System.Windows.Forms.Design.DesignerFrame, parented by
"" As System.Windows.Forms.Control, parented by
Nothing
在运行时MainForm标识为SpecificForm类型,在设计时可由设计者主持,但它现在标识为GenericType。
答案 0 :(得分:1)
我尊重你提出这个问题的事实。但是,并且不要误解我的意思,这个问题在某种程度上是一种天真的表现。您已经观察到大多数人没有的现象(祝贺您作为WinForms程序员已经接近成熟! - 我是认真的,而不是讽刺......)
现在,我说你的问题有点幼稚,因为这就像问“为什么圆圈这么圆?”。下一个解释可能听起来有点多余,但它是唯一的:
在设计时,在SpecificForm
的设计者中,您没有“运行”SpecificForm
的实例,而是您正在设计基于 {的原型{1}}这实际上是您“正在运行”的控件的类型(即,在运行时上下文中。)
我再说一遍,GenericForm
的设计师没有SpecificForm
“运行”的实例,而是SpecificForm
的实例。设计师中不存在GenericForm
实例,因为,嗯.. 您正在设计它!!!
我使用了这个确切的解释来指导其他用户了解他所看到的内容: https://stackoverflow.com/a/12499053/1426433。但你自己注意到了。
答案 1 :(得分:0)
另外,为了进一步记录您所看到的内容,您可以进行以下实验:
创建一个名为UserControl
的简单FooUserControl
,它将用于显示一个消息框,其中包含创建它的地方的堆栈跟踪:
using System;
using System.Windows.Forms;
namespace Test {
public partial class FooUserControl : UserControl {
public FooUserControl() {
InitializeComponent();
MessageBox.Show(Environment.StackTrace);
}
}
}
构建项目,现在打开任何表单设计器,例如,打开名为FooForm
的表单的设计者(它可能是您SpecificForm
的设计者或您正在创作的任何其他控件。)您将此FooUserControl
拖放到设计器表面上的那一刻,您将看到一个消息框,上面写着类似的内容;
每当你重新打开这个设计师时,你会看到类似的东西:
然而,每当你“运行”你的应用程序时,你会看到类似的东西:
所有这一切都在说, Windows窗体设计师甚至没有执行任何名为FooForm.InitializeComponent()
的方法。该方法仅在运行时执行,因为它仅在运行时执行正在设计的控件的构造函数,而后者又调用FooForm.InitializeComponent()
。
信不信由你,设计师正在做的事实上是在语句中解析FooForm.Designer.cs文件中的行(可能使用CodeDOM)。
希望这些解释有所帮助。