多个 winforms 用户控件的共享基础 Class?

Shared Base Class for numerous winforms UserControls?

当我找到答案时,感觉就像我要踢自己一样。我希望多个 UserControls 共享一些属性(如 ID)和事件(即它们都会引发相同的事件)。我尝试创建一个 BaseClass UserControl,然后在我的 UserControls 上尝试 Inherits BaseClass。但是,我收到错误消息:

Base class 'BaseClass' specified for Class Viewer cannot be different from the base class UserControl of one of its other partial types.

我在这里错过了什么?

编辑:为清楚起见,一些代码。这有望说明我希望它如何工作:

Public Class BaseUserControl
    Inherits UserControl

    Public Property ID
    Public Event ItemSelected()

End Class

Public Class Browser
    Inherits BaseUserControl

    Private Sub ButtonPressed() Handles Button1.click

        RaiseEvent ItemSelected()

    End Sub
End Class

Public Class NavBar
    Inherits BaseUserControl

    Private Sub EnterKeyDown() Handles TextBox1.KeyDown

        RaiseEvent ItemSelected()

    End Sub
End Class

Public Class Main

    Dim WithEvents browser As Browser With {.id = 12}
    Dim WithEvents navbar As NavBar With {.id = 624}

    Public Sub New()

        Me.controls.add(browser)
        Me.controls.add(navbar)

    End Sub

    Private Sub SelectionInBrowser() Handles brower.ItemSelected
        'Do amazing stuff
    End Sub

    Private Sub SelectionInNavBar() Handles navbar.ItemSelected
        'Do amazing stuff
    End Sub

End Class

您必须将基地 class 创建为 UserControl。例如。将其命名为 BaseUserControl。编译它。然后右键单击项目或项目中的文件夹并单击 Add > New Item。然后在左侧 select Windows Forms 然后 Inherited User Control (Windows Forms) .为其命名并单击 Add 按钮。现在会打开一个对话框,您可以在其中 select 您的 BaseUserControl。然后点击确定。 Visual Studio 为您施展魔法。例如。它会覆盖设计器生成的代码中的 Dispose。您可以手动完成,但像这样您可以免费获得它。

您可以在 BaseUserControl 上放置控件。它们将被继承并在派生用户控件中可见。

请注意,您必须将基本用户控件中控件的修饰符更改为ProtectedProteced FriendPublic,以便在继承用户控件中修改它们。


继承的例子。在 BaseUserControl 中,我放置了两个按钮 Button1Button2 并将它们设置为 Protected 以使它们在派生的 class 中可见。然后我双击 Button1。这将创建一个 Button1_Click 事件处理程序。我将其签名更改为

Public Class BaseUserControl
    Protected Overridable Sub Button1_Click(sender As Object, e As EventArgs) _
        Handles Button1.Click

        MessageBox.Show($"Hello from {NameOf(BaseUserControl)}.{NameOf(Button1_Click)}")
    End Sub
End Class

Protected Overridable。这不是绝对必要的,但它允许您在后代中覆盖它。

保存并编译然后打开MyUserControl,其中两个按钮可见。单击 Button2 还没有要创建的单击事件处理程序。

Public Class MyUserControl
    Private Sub Button2_Click(sender As Object, e As EventArgs) _
        Handles Button2.Click

        MessageBox.Show($"Hello from {NameOf(MyUserControl)}.{NameOf(Button2_Click)}")
    End Sub

    Protected Overrides Sub Button1_Click(sender As Object, e As EventArgs)
        MyBase.Button1_Click(sender, e)
        MessageBox.Show($"Hello from {NameOf(MyUserControl)}.{NameOf(Button1_Click)}")
    End Sub
End Class

如您所见,我也确实覆盖了 Button1_ClickMyBase.Button1_Click(sender, e)BaseUserControl.

调用原始实现

然后我将 MyUserControl 放在一个表单上并启动应用程序。单击 Button1 首先显示:

Hello from BaseUserControl.Button1_Click

并在通过单击 确定

关闭第一个消息框之后

Hello from MyUserControl.Button1_Click

点击 Button2 显示:

Hello from MyUserControl.Button2_Click