2

我有一个表单,它基于我拥有的另一种标准表单(支持透明度的表单),它在运行时通过自己的类型标识自己。然而,在设计器中,我设置了一些消息框输出,它们在设计时显示它在设计器控件堆栈的顶部标识为父类型。

示例代码

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。

4

2 回答 2

1

我尊重你提出这个问题的事实。但是,不要误会我的意思,这个问题有点天真。您观察到了大多数人没有观察到的现象(恭喜您作为 WinForms 程序员已接近成熟!--我是认真的,而不是讽刺的......)

现在,我说你的问题有点幼稚,因为这就像在问“为什么圆这么圆?”。下一个解释可能听起来有点多余,但它是唯一的一个:

SpecificFormSpecificForm_ _ GenericForm _运行时上下文。)

我再说一遍, 的设计者SpecificForm没有SpecificForm“正在运行”的实例,而是GenericForm. 设计器中不SpecificForm存在实例,因为,好吧..您正在设计它!

我使用这个确切的解释来指导另一个用户理解他所看到的内容: https ://stackoverflow.com/a/12499053/1426433 。但是你自己注意到了。

于 2012-09-19T17:29:25.187 回答
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)。

希望这些解释有所帮助。

于 2012-09-19T17:58:07.020 回答