2010-02-12 92 views
4

我正在工作的应用程序将具有大量共享功能的表单。例如,每个表单都会有一个DataGridView,许多相同的按钮,很多相同的UI代码等等。Winform继承和默认表单大小

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

我已经知道它有助于制作基本窗体的控件protected,因为这样可以使锚定等工作非常灵活。但是,我还没有找到一种方法来自动生成与基本表单相同大小的派生表单。

经验告诉我应该有一个简单的方法来做到这一点。尽管在创建后为每个派生表单手工输入所需的大小并不是什么大问题,但我宁愿尽可能使所有内容尽可能干净,简单和自动。

+1

我认为* [使用Visual C#.NET继承Windows窗体](http://www.akadia.com/services/dotnet_inherited_forms.html)*非常接近您的要求。这是真的还是不是? –

+0

@peter不好意见,但是我问了我的问题已经四年了。我现在没有做太多的C#,但我相信你的链接对于发生这个问题的任何其他人都是非常有帮助的。 – dandan78

回答

3

我觉得有趣的是,你的派生形式不会自动继承它们的基本形式的大小,因为这应该工作,而无需你做任何事情。你的问题的

设想的原因:

我怀疑的事实,你使用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 { ... } 
... 

另一种选择(如果一切都失败了最后一招):

作为最后的手段,你可以简单地忘了Forms Designer,并在代码编辑器中手动定义派生表单(尽管我个人不希望这样做):

public class DerivedForm : BaseForm 
{ 
    public DerivedForm() 
    { 
     // make all necessary changes to the base form: 
     ... 
    } 
} 
+0

你是对的。窗体设计器插入'this.ClientSize = new System.Drawing.Size(292,273);'行。当注释掉表单的大小合适时。有没有办法阻止表单设计者这样做? – dandan78

+0

是的,我只是扩大了我的答案。请参阅中间的“解决方法解决方案”部分。 – stakx

+0

正如您所指出的,解决方法似乎有点不标准,但看起来应该起作用。不过,我会尝试一下,如果没有更好的表现,你会得到复选标记。 :) – dandan78

0
public partial class derivedForm : baseForm 
{ 
    public derivedForm() 
    { 
     InitializeComponent(); 

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

是的,总是有这种方式,但我希望派生表单从基表自动继承它们的大小,如果可能的话。 – dandan78

+0

这个尺寸只会是相同的初始尺寸,还是尺寸是静态的不可调整大小的形式? –

+0

只是初始大小。现在它是默认的300x300。 – dandan78

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

这难道不是你想做的吗?

+0

试过了,不行。 – dandan78