C# 在设计时限制用户控件的大小

C# 在设计时限制用户控件的大小,c#,visual-studio,compact-framework,user-controls,design-time,C#,Visual Studio,Compact Framework,User Controls,Design Time,我有一个命名空间Company.UI.Forms,其中有一个表单基类BaseForm,它继承自System.Windows.Forms.form 我需要限制此表单的大小,以便如果具体表单(例如ExampleForm)派生自BaseForm,则它在VS designer视图中应该具有固定的大小。应该以某种方式(在BaseFormctor?)设置或定义固定大小,以便派生的ExampleForm和设计者选择它 可能吗 [编辑]目的是将基类用作已知屏幕大小的Windows CE设备的全屏表单模板,我希望

我有一个命名空间
Company.UI.Forms
,其中有一个表单基类
BaseForm
,它继承自
System.Windows.Forms.form

我需要限制此表单的大小,以便如果具体表单(例如
ExampleForm
)派生自
BaseForm
,则它在VS designer视图中应该具有固定的大小。应该以某种方式(在
BaseForm
ctor?)设置或定义固定大小,以便派生的
ExampleForm
和设计者选择它

可能吗


[编辑]目的是将基类用作已知屏幕大小的Windows CE设备的全屏表单模板,我希望能够在设计器中为其布局子控件。

我不认为有任何直接支持此类场景。子窗体可以覆盖控制窗体上最大大小的所有值。因此,无法从属性角度对其进行约束


我能想到的唯一方法是重写size changed方法,并将大小重置为max size(最大大小)。不过,这可能会产生一些不良影响,您应该在将其作为解决方案解决之前将其过期

在标准WinForms中,您可以覆盖SetBoundsCore方法。此代码将阻止基类在设计时更改它。。。但请记住,它可以被任何继承的类覆盖:

protected override void SetBoundsCore(int x, int y,
     int width, int height, BoundsSpecified specified)
{
  if (this.DesignMode)
    base.SetBoundsCore(x, y, 500, 490, specified);
  else
    base.SetBoundsCore(x, y, width, height, specified);
}

我之所以放置if,是因为您指定在设计时,如果您不想在运行时调整大小,也可以将其删除。

好的,现在对于CF,quick solution,您可以通过在字段中存储大小来执行更干净的代码

public BaseForm()
{
 InitializeComponent();
 this.Size=new Size(20,20);
}


bool resizing;

protected override void OnResize(EventArgs e)
{   
 if(!resizing)
 {
   resizing = true;
   try
   {
     this.Size = new Size(20, 20);
   }
   finally
   {
     resizing = false;
   }
 }
 else
   base.OnResize(e);
}

假设我们在usercontrol中有一个名为“button1”的按钮。 我希望،在设计时更改用户控件大小时،按钮1的大小与用户控件的大小进行调整

此解决方案具有工作特性

在usercontrol的Resize事件中,编写以下内容

 private void ButtonDesigned_Resize(object sender, EventArgs e)
    {            
        button1.Size = new Size(this.Size.Width - 2, this.Size.Height - 2); 

         // Note :  this.size hint to usercontrol size 

         or

        button1.Size = this.Size
    }

我的英语不好。我认为这个解决方案对您来说已经足够了。

SetBoundsCore
在.Net中不可用CF.:-(哦,对不起,我没有注意到这是关于CFIT的,它在运行时是可调整大小的,还是固定大小的?已修复。其目的是将基类用作已知屏幕大小的Windows CE设备的全屏窗体的模板,我希望能够在设计器中布局子控件。我的第二个答案对您有用吗?@jmservera:很抱歉,但是没有…:-(然后派生类就可以重写OnResize,而您什么也没做。是的,当然,但是您通常这样做是为了避免使用设计器错误地更改表单的大小,而不是束缚开发人员的手。请阅读问题,它会问:“在VS designer视图中应该有一个固定的大小”。