gpt4 book ai didi

c# - 扩展 WinForm UserControl 基类的正确架构?

转载 作者:行者123 更新时间:2023-11-30 21:12:54 25 4
gpt4 key购买 nike

我有大量非常相似的用户控件。他们有很多共同的行为。我一直在使用具有通用内容的基类,然后根据需要专门化该类。

class BaseControl : UserControl 
{
// common
}

class RedControl : BaseControl
{
// specialized
}

class BlueControl : BaseControl
{
// specialized
}

等...

在我需要开始插入或更改 BaseControl 中包含的子控件的布局之前,它工作得相当好。例如,RedControl 需要将一个按钮添加到基本控件的特定面板。在其他情况下,我需要更改其他基本子控件的大小或布局。

当我尝试下面的代码时,我在运行时没有看到任何按钮...

public partial class RedControl : BaseControl
{
public RedControl()
{
InitializeComponent();

addButtonToBase(); // no button shows up
this.PerformLayout();
}
void addButtonToBase()
{
Button button = new Button();
button.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
button.Location = new System.Drawing.Point(3, 3);
button.Size = new System.Drawing.Size(23, 23);
button.Text = "My Button";

baseSplitContainer.Panel1.Controls.Add(button); // protected child control in base
}
// ...
}

如果我将 addButtonToBase() 设为虚拟并手动将其添加到 BaseControl 的 InitalizeComponent() 中生成的代码中,我可以使按钮显示为 baseSplitContainer 的子项。BaseControl 的布局仍在继续,您可以在 C#.Net 的构造函数中调用虚函数....

所以即使它有效,也不是一个好的解决方案。一方面,当我在 VS 设计器中编辑 BaseControl 时,IntializeComponent 中对 addBaseControl() 的调用被删除,对于另一个在构造函数中调用虚函数感觉很危险。

我想我需要让基控件的布局在派生控件中再次发生...我试过了,但要么做错了,要么行不通......

顺便说一句,是的,我知道 WPF 擅长于此。由于其他系统的限制而无法使用它。

最佳答案

事实证明,修改基本控件布局的正确方法是覆盖来自 Control.OnLayout() 的布局调用

类似的东西

public RedControl()
{
//....
protected override void OnLayout(LayoutEventArgs e)
{
addButtonToBase(); // modify base layout
base.OnLayout(e);
}
}

关于c# - 扩展 WinForm UserControl 基类的正确架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com