【问题标题】:.NET WinForms Custom Control: how to get a reference to the containing form.NET WinForms 自定义控件:如何获取对包含表单的引用
【发布时间】:2010-09-23 22:50:32
【问题描述】:

有没有办法在创建 WinForms 自定义控件/用户控件时在运行时获取对放置控件的窗体的引用,以便访问该窗体的各种属性?我宁愿不将表单的引用传递给控件的构造函数,因为出于各种原因,我需要保留一个不带参数的默认构造函数。

一个例子:我有几个封装了 Win32 API 调用的自定义控件,其中一些调用需要将窗口句柄作为参数传递。我希望能够检索包含表单的句柄,以便将其传递给 API 函数。

另一个例子:我有一个自定义控件,它提供“toast”样式的用户通知。我希望可以选择在相对于主申请表位置的位置打开通知表,例如以主窗口为中心、向右偏等。显然,如果不知道主应用程序窗口的坐标。

可以在某些情况下使用 FindWindowEx() 类型的 API 调用,但这感觉就像是一个杂物,而且并非在所有情况下都有效。

有人知道这是否可行吗?

【问题讨论】:

    标签: .net windows winforms custom-controls


    【解决方案1】:

    您可以使用Control.TopLevelControl 属性。

    【讨论】:

    • 这看起来很有希望。我会试试的。
    【解决方案2】:

    你想要Control.Parent,它返回父控件。要获取表单,只需在所有父控件上调用 parent,直到您点击 System.Windows.Forms.Form

    【讨论】:

    • 这看起来可行,但我正在寻找不需要循环等的简单东西。
    • @AndrewC:如果这样的循环不简单,那么除了试图获得最高控制权之外,您还有其他问题。
    • :-) 我的意思是对属性的一次调用,而不是循环的多次迭代。哪个对你来说更简单?也许“更少的代码”会更准确?
    【解决方案3】:

    试试FindForm 方法。请注意,如果在控件的构造函数中调用它将返回null

    如果您可以等到OnParentChanged 事件,那么FindForm 将返回对父表单的引用。

    【讨论】:

    • 这看起来可行,但我正在寻找不需要循环等的简单东西。
    猜你喜欢
    • 2011-03-15
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多