代码之家  ›  专栏  ›  技术社区  ›  anonym0use

VB.Net中的窗体

  •  2
  • anonym0use  · 技术社区  · 17 年前

    我有c#背景,正在将vb.net windows窗体应用程序转换为c#。 我有一个名为associateForm的windows窗体。 在代码中,开发人员引用关联表单,如下所示:-

    Private Sub NotifyIcon1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles EMS.MouseDoubleClick
        If e.Button = Windows.Forms.MouseButtons.Left Then
    
            If associateForm.WindowState = FormWindowState.Normal And associateForm.Visible = True Then
                associateForm.WindowState = FormWindowState.Minimized
            Else
                associateForm.WindowState = FormWindowState.Normal
            End If
    
            associateForm.Show()
            associateForm.Focus()
            'bring to front of other windows
            associateForm.Activate()
        End If
    End Sub
    

    但问题是,associateForm并没有在执行方法的类中实例化。类也不是静态的。代码中似乎也没有该类的实例。有人能解释一下为什么这似乎有效吗?但当我在C#中尝试时,它没有任何效果。

    4 回复  |  直到 17 年前
        1
  •  6
  •   Joel Coehoorn    17 年前

    VB.Net for。Net 2.0及更高版本有一种称为默认表单实例的东西。定义表单时,您会得到一个与类型同名的表单自动实例。

        2
  •  2
  •   Konrad Rudolph    17 年前

    前面的评论有几点不对劲。乔尔的答案基本上是正确的,但有一个小警告:

    定义表单时,您会得到一个与类型同名的表单自动实例。

    实际上,只有当你 呼叫 在此之前,不会创建默认实例。因此,实例创建被推迟到使用时。

    将表单名称用作实例实际上是 My.Forms.Formname ,这是编译器为所有表单生成的属性列表。这些属性负责对象的创建。不幸的是,微软决定在全局范围内隐式提供这些属性(因此OP提出了问题)。

    此功能的存在是因为VB.NET模拟了VB6方法,能够通过窗体的名称引用窗体的默认实例。

    好。虽然这个功能 受VB早期版本的启发,它不是直接的后裔。VB 7没有它。相反,它是在VB 8(=VB 2005)中重新引入的。

    一个非常愚蠢的“功能”

    实际上,这是一个非常有用的功能,与VB的RAD开发理念非常契合。如上所述,不幸的是,采用了如此宽松的范围界定。但除此之外,我会 非常 有兴趣听听这个功能有什么愚蠢的地方。

        3
  •  0
  •   RS Conley    17 年前

    乔尔是对的。此功能的存在是因为VB.NET模拟了VB6方法,能够通过窗体的名称引用窗体的默认实例。

    当您将其转换为C#时,您需要提供对名为associateForm的单个实例的全局访问。在调用此表单之间,有可能会保留一些内容。在您成功使其以这种方式工作后。然后,您可以重构软件并测试本地实例化是否也能正常工作。

        4
  •  0
  •   Richard Ev    17 年前

    我不能直接回答你的问题,但是。..

    我猜你正在手动从VB.Net转换到C#——你试过使用 automatic convertor 相反?