【问题标题】:Winform inheritance and default form sizeWinform继承和默认表单大小
【发布时间】:2010-02-12 13:40:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为 Inheriting Windows Forms with Visual C# .NET 非常接近您的要求。这是真的还是假的?
  • @peter 很高兴您发表评论,但自从我提出问题以来已经四年了。我现在做的 C# 不多,但我相信你的链接会对遇到这个问题的其他人非常有帮助。

标签: c# winforms visual-inheritance


【解决方案1】:

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

您的问题的怀疑原因:

我怀疑您的问题是因为您使用 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:
        ...
    }
}

【讨论】:

  • 没错。表单设计器插入了this.ClientSize = new System.Drawing.Size(292, 273); 行。注释掉时,表格大小合适。有什么办法可以阻止表单设计器这样做吗?
  • 是的,我只是相应地扩展了我的答案。请参阅中间的“解决方法”部分。
  • 正如您所指出的,解决方法似乎有点不标准,但看起来应该可以。不过,我会尝试一下,如果没有更好的结果,你会得到复选标记。 :)
【解决方案2】:
public partial class derivedForm : baseForm
{
    public derivedForm()
    {
        InitializeComponent();

        this.Width = base.Width;
        this.Height = base.Height;
    }
}

【讨论】:

  • 是的,总是这样,但如果可能的话,我希望派生表单自动从基本表单继承它们的大小。
  • 这个尺寸是只有相同的初始尺寸还是一个不可调整大小的形式,尺寸是静态的?
  • 只是初始大小。现在它是默认的 300x300。
【解决方案3】:

为什么不让 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;
    }
}

这不是你想要的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2015-07-09
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多