多个 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
上放置控件。它们将被继承并在派生用户控件中可见。
请注意,您必须将基本用户控件中控件的修饰符更改为Protected
、Proteced Friend
或Public
,以便在继承用户控件中修改它们。
继承的例子。在 BaseUserControl
中,我放置了两个按钮 Button1
和 Button2
并将它们设置为 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_Click
。 MyBase.Button1_Click(sender, e)
从 BaseUserControl
.
调用原始实现
然后我将 MyUserControl
放在一个表单上并启动应用程序。单击 Button1
首先显示:
Hello from BaseUserControl.Button1_Click
并在通过单击 确定
关闭第一个消息框之后
Hello from MyUserControl.Button1_Click
点击 Button2
显示:
Hello from MyUserControl.Button2_Click
当我找到答案时,感觉就像我要踢自己一样。我希望多个 UserControls 共享一些属性(如 ID)和事件(即它们都会引发相同的事件)。我尝试创建一个 BaseClass UserControl
,然后在我的 UserControls 上尝试 Inherits BaseClass
。但是,我收到错误消息:
Base class 'BaseClass' specified for Class
Viewer
cannot be different from the base classUserControl
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
上放置控件。它们将被继承并在派生用户控件中可见。
请注意,您必须将基本用户控件中控件的修饰符更改为Protected
、Proteced Friend
或Public
,以便在继承用户控件中修改它们。
继承的例子。在 BaseUserControl
中,我放置了两个按钮 Button1
和 Button2
并将它们设置为 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_Click
。 MyBase.Button1_Click(sender, e)
从 BaseUserControl
.
然后我将 MyUserControl
放在一个表单上并启动应用程序。单击 Button1
首先显示:
Hello from BaseUserControl.Button1_Click
并在通过单击 确定
关闭第一个消息框之后Hello from MyUserControl.Button1_Click
点击 Button2
显示:
Hello from MyUserControl.Button2_Click