4

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

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

我已经发现它有助于制作基本表单的控件protected,因为这可以让锚定之类的东西正常工作。但是,我还没有找到一种方法来自动使派生表单与基本表单大小相同。

经验告诉我应该有一个简单的方法来做到这一点。虽然在创建后立即为每个派生表单手动输入所需的大小并不是什么大问题,但我更愿意让一切尽可能干净、简单和自动化。

4

3 回答 3

4

我觉得有趣的是,您的派生表单不会自动从其基本表单继承大小,因为这应该可以在您不必做任何事情的情况下工作。

您的问题的怀疑原因:

我怀疑您的问题是由于您使用 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(...);

一旦这些行被注释掉,在您的基本表单中设置的大小InitializeComponent将用于派生表单。

一种解决方法:

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

创建一个从基本表单派生的表单;让我们称之为FrozenBaseForm。您将从此类派生所有其他形式,而不是直接从基本形式派生。现在,在这个“中间”类中,您定义了一个新属性ClientSize

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

这将导致所有分配ClientSize完全没有效果,因此保留基本形式的大小。说实话,这感觉像是一种黑客攻击,但它似乎有效。Size顺便说一句,您可能必须以相同的方式隐藏该属性。

如前所述,从而FrozenBaseForm不是BaseForm直接派生您的表单:

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

另一种选择(如果一切都失败了,最后的手段):

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

public class DerivedForm : BaseForm
{
    public DerivedForm()
    {
        // make all necessary changes to the base form:
        ...
    }
}
于 2010-02-12T14:20:38.433 回答
0

为什么不让 BaseForm 设置自己的大小?

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;
    }
}

这不是你想要的吗?

于 2010-02-12T14:07:23.640 回答
0
public partial class derivedForm : baseForm
{
    public derivedForm()
    {
        InitializeComponent();

        this.Width = base.Width;
        this.Height = base.Height;
    }
}
于 2010-02-12T13:52:34.263 回答