我正在使用的应用程序将具有许多具有大量共享功能的表单。例如,每个表单都有DataGridView
,许多相同的按钮,大部分相同的UI代码等等。
我想通过创建这个常见表单的基本版本来实现它,将它子类化为所有这些非常相似但不完全相同的子表单,并强调任何其他控件和功能我需要他们每个人。
我已经发现有助于制作基本表单的控件protected
,因为这样可以使锚定工作变得有效。但是,我还没有找到一种方法来自动使派生形式与基本形式相同。
经验告诉我应该有一个简单的方法来做到这一点。虽然在创建后立即为每个派生表单手工输入所需尺寸并不是一个大问题,但我希望尽可能使一切尽可能干净,简单和自动。
答案 0 :(得分:3)
我觉得有趣的是,你的派生表单不会自动从其基本表单继承大小,因为这应该可以在你不必对它做任何事情的情况下工作。
您的问题可疑原因:
我怀疑您的问题是因为您使用Visual Studio的Forms Designer来编辑表单。每当您编辑表单时,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
的所有作业完全没有效果,因此会保留基本表单的大小。这听起来像是一个说实话的黑客,但它似乎工作。您可能必须以与btw相同的方式隐藏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:
...
}
}
答案 1 :(得分:0)
public partial class derivedForm : baseForm
{
public derivedForm()
{
InitializeComponent();
this.Width = base.Width;
this.Height = base.Height;
}
}
答案 2 :(得分: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;
}
}
这不是你想做的吗?