如何以这种方式正确子类UserControl?

时间:2014-12-08 06:24:51

标签: c# vb.net winforms visual-studio user-controls

  

SCENARIO

我有一个子类化的NumericDown:

Public Class MyNumericUpDown : Inherits NumericUpDown

  ' More code here that does not matter...

End Class

我想将其编译为 WindowsForms控件库项目的UserControl,以便在调试项目时获得UserControl属性网格的优势。

  

问题

我无法在不破坏 WindowsForms控件库项目的自动生成的Usercontrol类的情况下找到编译我的NumericDown的方法,这意味着打破了属性网格功能和编译项目后有一个最后的异常消息,告诉我我的DLL:doesn't contain any UserControl types(但确实有,我可以将它添加到VS控件工具箱中)。

  

问题

在C#或VB中,我如何正确地将 WindowsForms控件库项目设置为仅显示我的自定义NumericDown而不会丢失属性网格功能?

我希望你能理解我想要的东西。

我会试着用其他的话来说:我只想在属性网格中测试我的NumericUpDown,而不是默认由 WindowsForms控件库项目生成的用户控件。

将dll添加到VisualStudio控件工具箱中应该是一个“单位”,而是我得到两个独立的控件。

  

CODE:

我没有更好的展示,因为我无法找到信息来开始这样做。

Public Class UserControl1 : Inherits UserControl

    Public Sub New()

        InitializeComponent()

        ' This is not what I want, 
        ' or at least I think it shouldn't be done as normally like this, 
        ' I only want to use and see my custom NumericUpDown on the property grid, 
        ' not depending on any UserControl ControllCollection.
        Me.Controls.Add(New MyNumericUpDown)

    End Sub

End Class

1 个答案:

答案 0 :(得分:1)

Visual Studio附带的测试应用程序仅搜索从UserControl派生的控件。如果您希望它能够查看/测试其他类型,那么您需要创建一个自定义应用程序。

以下代码只是概念证明。实现完整工作应用程序的最简单方法是简单地将UserControlTestContainer.exe放到像反射器这样的反编译器上并复制代码。

  1. 创建自定义Windows窗体应用程序并将其命名为UserControlTestContainer
  2. 创建共享子主。
  3. 取消选中enable application framework并将startup object设置为sub main
  4. 当你的代码看起来像我的时,建立。
  5. Public Class Form1
    
        Public Sub New(Optional ByVal args As String() = Nothing)
            Me.InitializeComponent()
            Me.args = New Label With {.Dock = DockStyle.Fill, .Text = If((args Is Nothing), "(null)", String.Join(Environment.NewLine, args))}
            Me.Controls.Add(Me.args)
        End Sub
    
        <STAThread()>
        Public Shared Sub Main(Optional ByVal args As String() = Nothing)
            Application.EnableVisualStyles()
            Application.Run(New Form1(args))
        End Sub
    
        Private args As Label
    
    End Class
    
    1. 使用您的自定义UserControlTestContainer.exe替换C:\Program Files (x86)\Microsoft Visual Studio {version}\Common7\IDE中的默认UserControlTestContainer.exe
    2. 返回Windows窗体控件库,创建一个派生自Control并点击运行的自定义控件。
    3. Custom UserControl Test Container