C# 从UserControl继承-双UI?

C# 从UserControl继承-双UI?,c#,winforms,inheritance,C#,Winforms,Inheritance,我对WinForm项目中UserControl的继承有疑问 我有几个特定的面板,它们是我的应用程序的不同页面。 但是这些特定的面板在每个面板中都有一些重复的公共代码 因此,我想在从UserControl继承的StdPanel类中对它们的常见行为进行编码,然后每个特定页面将从StdPanel继承 具体小组: public partial class SpecificPanel1 : StdPanel { public SpecificPanel1 () : bas

我对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是在特定的Panel1中完成的,我认为这是不必要的

那么SpecificPanel1有两个GUI吗

这两个GUI是如何嵌套的?它们是否出现在屏幕上,但一个隐藏第二个

谢谢

单词“partial”将一个类拆分为两个文件。没有两个类和两个GUI。只有一个类的两个源代码文件

这有助于将生成的代码与手动编写的代码分离

您可以查看designer.cs,但最好不要修改它(除非您知道自己在做什么)。

单词“partial”将一个类拆分为两个文件。没有两个类和两个GUI。只有一个类的两个源代码文件

这有助于将生成的代码与手动编写的代码分离


您可以查看designer.cs,但最好不要修改它(除非您知道自己在做什么)。

是否要使用WIndows窗体设计器?那就守住电话线。它对这个类来说是特殊的,它不是继承的或者什么的,你可以检查里面发生了什么。如果您已经通过属性窗口创建了事件处理程序,那么最好保持原样。你在说什么接口?您的代码中没有接口。@霍尔格猜他指的是GUI而不是C#interface是的,我指的是GUI而不是interface。谢谢。您可以使用
InitializeComponent()
重新定义继承组件的布局。通常,基类控件的访问修饰符设置为
private
。在这种情况下,派生类的
InitializeComponent()
方法无法重新定义基类的布局。您可以将修饰符设置为
protected
/
protectedinternal
,以便可以在派生类中重新定义这些控件的布局。然后在初始化派生类时调用的
InitializeComponent()
中定义派生类特有的新行为。派生类的
InitializeComponent()
方法可以对基类模板进行局部添加,以重新定义/专门化图形界面。不过,还有更多与表单设计器要求相关的内容,因为基类和派生类都有自己的设计器。是否要使用WIndows表单设计器?那就守住电话线。它对这个类来说是特殊的,它不是继承的或者什么的,你可以检查里面发生了什么。如果您已经通过属性窗口创建了事件处理程序,那么最好保持原样。你在说什么接口?您的代码中没有接口。@霍尔格猜他指的是GUI而不是C#interface是的,我指的是GUI而不是interface。谢谢。您可以使用
InitializeComponent()
重新定义继承组件的布局。通常,基类控件的访问修饰符设置为
private
。在这种情况下,派生类的
InitializeComponent()
方法无法重新定义基类的布局。您可以将修饰符设置为
protected
/
protectedinternal
,以便可以在派生类中重新定义这些控件的布局。然后在初始化派生类时调用的
InitializeComponent()
中定义派生类特有的新行为。派生类的
InitializeComponent()
方法可以对基类模板进行局部添加,以重新定义/专门化图形界面。不过,还有更多与表单设计器要求相关的内容,因为基类和派生类都有自己的设计器。即使您知道自己在做什么,也应该将其视为只读,因为设计器UI可以并将覆盖您的更改。也许我的问题不够清楚:有一个InitializeComponent()在SpecificPanel1和StdPanel中的一个InitializeComponent()。SpecificPanel1继承自StdPanel。有两个GUI吗?每个InitializeComponent()都在生成一个GUI,不是吗?@Timmeh只有在设计器打开时才是这样。设计器将读取此文件以显示可视化UI。只要他能读,一切都好。@Aurel你不应该那样做。不要从设计器创建的用户控件继承。而是将一个控件放入另一个控件中。(就像在控件中放置标签一样)。答案仍然是一样的:如果你想使用Designer,不要删除它。并查看“InitilizeComponent”以了解其中发生的情况。即使您知道自己在做什么,也应该将其视为只读,因为设计器UI可以并将覆盖您的更改。也许我的问题还不够清楚:SpecificPanel1中有一个InitializeComponent(),StdPanel中有一个InitializeComponent()。SpecificPanel1继承自StdPanel。有两个GUI吗?每个InitializeComponent()都在生成一个GUI,不是吗?@Timmeh只有在设计器打开时才是这样。设计器将读取此文件以显示可视化UI。只要他能读,一切都好。@Aurel你不应该那样做。不要从设计器创建的用户控件继承。而是将一个控件放入另一个控件中。(就像在控件中放置标签一样)。答案仍然是一样的:如果你想使用Designer,不要删除它。看看“我