【发布时间】:2020-01-15 00:11:06
【问题描述】:
我对 WinForm 项目中 UserControl 的继承有疑问。
我有几个特定的面板,它们是我的应用程序的不同页面。 但是这些特定面板在每个面板中都重复了一些通用代码。
所以我想在从 UserControl 继承的 StdPanel 类中编写它们的共同行为,然后每个特定页面都将从 StdPanel 继承。
一个特定的面板:
public partial class SpecificPanel1 : StdPanel
{
public SpecificPanel1 () : base()
{
InitializeComponent();
}
}
标准面板:
public partial class StdPanel: UserControl
{
public StdPanel()
{
InitializeComponent();//Keeping this line or not?
}
private void StdPanel_VisibleChanged(object sender, EventArgs e)
{
if (Visible)
{
//do stuff...
}
}
}
我的问题:
我的问题: 我想在 StdPanel_VisibleChanged 时做一些事情,我做了很多测试,我知道 InitializeComponent() 是使 StdPanel_VisibleChanged 事件工作所必需的。 起初,我想从 StdPanel 中删除 InitializeComponent(),因为 GUI 是在 SpecificPanel1 中完成的,我认为没有必要。
SpecificPanel1 有两个 GUI 吗?
这两个 GUI 是如何嵌套的?它们是否出现在屏幕上但一个隐藏了第二个?
谢谢
【问题讨论】:
-
您想使用 WIndows-Forms Designer 吗?然后保持线路。它对这个类很特别,它不是继承的什么的,你可以检查那里发生了什么。如果您已经通过属性窗口创建了事件处理程序,则最好保持原样。你在说什么接口?您的代码中没有接口。
-
@Holger 猜他指的是 GUI 而非 C# 接口
-
是的,我指的是 GUI 而不是界面。谢谢。
-
您可以使用
InitializeComponent()重新定义继承组件的布局。通常,您的基类控件的访问修饰符设置为private。在这种情况下,派生类的InitializeComponent()方法无法重新定义基类的布局。可以将修饰符设置为protected/protected internal,这样就可以在派生类中重新定义这些控件的布局。这种特定于派生类的新行为随后在InitializeComponent()中定义,在初始化派生类时调用。 -
派生类的
InitializeComponent()方法可以在基类模板的基础上添加local,重新定义/特化图形界面。不过,还有更多与表单设计器要求相关的内容,因为基类和派生类都有自己的设计器。
标签: c# winforms inheritance