代码之家  ›  专栏  ›  技术社区  ›  dandan78 Tom Cool

Winform继承和默认表单大小

  •  4
  • dandan78 Tom Cool  · 技术社区  · 16 年前

    我正在使用的应用程序将有许多表单,其中包含许多共享功能。例如,每个表单都有一个 DataGridView ,许多相同的按钮,许多相同的UI代码等等。

    我想通过创建一个通用表单的基础版本来实现这一点,为所有这些非常相似但不完全相同的子表单创建子类,并为每个子表单添加我需要的任何附加控件和功能。

    我已经发现它有助于创建基窗体的控件 protected 因为这允许像锚定这样的事情正常工作。然而,我还没有找到一种方法来自动使派生表单与基础表单的大小相同。

    3 回复  |  直到 16 年前
        1
  •  4
  •   stakx - no longer contributing Saravana Kumar    16 年前

    我发现很有趣的一点是,您的派生表单不会自动从它们的基表单继承大小,因为这应该可以工作,而无需您对此做任何事情。

    问题的可疑原因:

    我怀疑您的问题是因为您正在使用Visual Studio的表单设计器编辑表单。无论何时编辑表单,Windows窗体设计器都会在 InitializeComponent 你的表格的方法。在所有生成的代码中,有设置表单大小的赋值,即使它与基本表单的大小相同。因此,如果希望派生表单的大小与基础表单相同,即使在创建派生表单后更改基础表单的大小,也可能需要手动注释掉这些赋值(然而,我不知道这是否会导致进一步的控制定位问题;布局。)

    // Code to be commented out in your derived form's InitializeComponent method:
    this.AutoScaleDimensions = new System.Drawing.SizeF(...);
    this.ClientSize = new System.Drawing.Size(...);
    

    一旦这些行被注释掉,在基本表单的 初始化组件 将用于派生窗体。

    解决方案:

    您可以执行以下操作,以便不必在每次编辑表单时手动注释掉设计器生成的代码:

    创建从基础表单派生的表单;就这么定了 FrozenBaseForm ClientSize

    public class FrozenBaseForm : BaseForm
    {
        new public SizeF ClientSize
        {
            get { return base.ClientSize; }
            set { }
        }
    }
    

    客户人数 完全没有效果,因此保留基础形状的大小。这让人感觉像是在说实话,但它似乎奏效了。你可能不得不隐藏这个秘密 Size 财产以同样的方式顺便说一句。

    冰冻基型 而不是从 BaseForm 直接:

    public class DerivedForm1 : FrozenBaseForm { ... }
    public class DerivedForm2 : FrozenBaseForm { ... }
    ...
    

    另一种选择(如果所有其他方法都失败,则为最后手段):

    作为最后一种手段,您可以简单地忘记表单设计器,只需在代码编辑器中手动定义派生表单(尽管我个人不想这样做):

    public class DerivedForm : BaseForm
    {
        public DerivedForm()
        {
            // make all necessary changes to the base form:
            ...
        }
    }
    
        2
  •  0
  •   Stuart Grassie    16 年前
    public partial class derivedForm : baseForm
    {
        public derivedForm()
        {
            InitializeComponent();
    
            this.Width = base.Width;
            this.Height = base.Height;
        }
    }
    
        3
  •  0
  •   xian    16 年前

    为什么不让基窗体设置自身的大小?

    public partial class BaseForm : Form
    {
        public BaseForm()
        {
            InitializeComponent();
    
            // you could hardcode these or retrieve these values from a
            // config file or something
            this.Width = 640;
            this.Height = 468;
        }
    }
    

    这不是你想要的吗?

    推荐文章