c# - Winform继承和默认窗体大小

标签 c# winforms visual-inheritance

我正在使用的应用程序将包含许多具有大量共享功能的表单。例如,每个表单都有一个 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/

相关文章:

c# - 如何将缩略图从主图下方移动到主图右侧?

c# - 启用 Animator 会导致闪烁吗?

c# - mvp 模式中的(嵌套)用户控件导致偶发问题

c# - 如何让一个窗口在 .Net 中始终保持在最前面?

forms - 如何以可继承的形式更改工具按钮的顺序?

c# - 在 MVC 4 中为 3 层架构配置 Ninject

c# - 术语 "reference"的起源与 "pass-by-reference"

c# - 表单加载后取消异步操作?

C# 可视化子类 datagridview 控件 VS2005

c# - WinForms ToolStrip 在视觉继承中不可用