【问题标题】:Dynamic event without creating an instance无需创建实例的动态事件
【发布时间】:2013-11-14 19:53:29
【问题描述】:

我们可以在不创建对象实例的情况下将事件处理程序动态附加到类吗?

我的场景

从主窗体 [Level 0] 我正在调用子窗体 [Level 1],我可以从主窗体向这些子窗体添加动态事件。但是从子表单中,我再次调用表单 [级别 2]。我无法从此级别 [级别 2] 添加动态事件。我不知道什么时候从Level 1 调用了一个表单,它一定是按钮点击事件或任何其他事件。

下面的代码不起作用,因为它需要一个实例,这里 frm 是一个实例

Dim frmLoad = New FormLoadEventHandler(AddressOf On_Load)
t.GetEvent("Load").AddEventHandler(frm, frmLoad)

我正在将单个程序集加载到单个平台中,因此每个单独的程序集都有很多子表单,我可以从我的主模块通过反射访问初始表单。我的想法是使从我的平台调用的所有形式的字体都相同

【问题讨论】:

  • 我可能遗漏了一些东西,但这对我来说没有意义......如果没有表单的实例,就不会引发任何事件。您的意思是没有对实例的 reference 吗?如果是这样,那么答案是否定的 - 但它很容易解决 - 只需通过您的代码将相关引用传递到需要的位置(将 l2frm 传递到 l0frm 或反之亦然)
  • 我正在将单个程序集加载到单个平台中,因此每个单独的程序集都有很多来自我的主模块的子表单,我可以通过反射访问初始表单。我的想法是使从我的平台调用的所有形式的字体都相同
  • 这听起来不像是一个干净的架构。 “单一平台”是什么意思?单个 AppDomain/进程/???如果您可以控制程序集,则不需要反射(99% 的时间)。如果您无法控制,更改字体可能会导致问题(文本溢出时会发生什么情况?)。反射仅在您处理未知类型时才有用 - 您的类型未知是否有充分的理由?

标签: .net winforms events dynamic instance


【解决方案1】:

将主窗体的实例传递给 2 级窗体,并使用传递的引用添加事件处理程序。

【讨论】:

    【解决方案2】:

    把字体传进去怎么样....

    'Modify a form so the constructor takes a font
    
    Private Property CustomFont As Font
    Public Sub New(FontToUse As Font)
        ' This call is required by the designer.
        InitializeComponent()
    
        'Store the font for later use       
        Me.CustomFont = FontToUse
    
        'Use the font on all controls as appropriate here
    End Sub
    
    
    Public Sub MakeChildren()
        'Create a child form and tell it which font to use
        Dim ChildForm As New ChildForm(CustomFont)
        ChildForm.Show()
    End Sub
    

    等等等等

    【讨论】:

    • 基本...我无法编辑代码,我正在使用反射打开我的主窗体中的程序集,如插件模块。
    • 好的,那么暂时搁置这是一个非常糟糕的主意(您不知道更改字体会使表单无法使用),您必须使用反射来阅读用于存储对每个表单的引用的内部变量 - 假设引用被保留。如果做不到这一点,您可以使用 Win32 Api 查找进程的所有窗口并获取它们的句柄 ...stackoverflow.com/a/79205/156755 它会起作用,但它很臭,实际上您应该让插件设计者以允许的标准方式开发他们的模块您需要的访问权限
    • 感谢您的支持
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2021-02-19
    • 2020-06-22
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多