我正在使用的应用程序将包含许多具有大量共享功能的表单。例如,每个表单都有一个 DataGridView
、许多相同的按钮、许多相同的 UI 代码等等。
我想通过创建这个通用表单的基础版本来实现这一点,为所有这些非常相似但不完全相同的子表单对其进行子类化,并附加任何我认为的附加控件和功能他们每个人都需要。
我已经发现它有助于使基本窗体的控件 protected
因为这允许诸如锚定之类的事情正常工作。但是,我还没有找到一种方法来自动使派生表单与基本表单大小相同。
经验告诉我应该有一个简单的方法来做到这一点。虽然在创建每个派生表单后立即手动输入所需的大小并不是什么大问题,但我更愿意让一切尽可能干净、简单和自动化。
最佳答案
我觉得有趣的是,您的派生表单不会自动从它们的基本表单继承大小,因为这应该可以工作,您无需对此做任何事情。
问题的可能原因:
我怀疑您的问题是由于您正在使用 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
的所有赋值完全无效,因此会保留基本表单的大小。说实话,这感觉像是一个 hack,但它似乎有效。您可能必须以同样的方式隐藏 Size
属性。
如前所述,从 FrozenBaseForm
而不是直接从 BaseForm
派生表单:
public class DerivedForm1 : FrozenBaseForm { ... }
public class DerivedForm2 : FrozenBaseForm { ... }
...
另一种选择(如果一切都失败了,最后的手段):
作为最后的手段,您可以简单地忘记 Forms Designer 而只是在代码编辑器中手动定义派生的表单(尽管我个人不想这样做):
public class DerivedForm : BaseForm
{
public DerivedForm()
{
// make all necessary changes to the base form:
...
}
}
关于c# - Winform继承和默认窗体大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2252110/