问题描述
用ANCHOR和DOCK我试过了,效果不太好,控件的大小变不了,都LEFT,TOP锚定的话,右边会空一大截很难看,上下左右的话就重叠了
解决方案
解决方案二:
上面的上下左右,下面的下左右。这样下面的高度不变,上面的会占用剩余高度。你可以看一下,很多软件布局都是这样的,总一块是固定高度或固定宽度。如果你说一定要上下等比,那你可以用:TableLayoutPanel来布局。
解决方案三:
还是会重叠啊
解决方案四:
添加resize事件,然后自定义控件的大小
解决方案五:
在resize时间里通过计算,重画所有控件的大小,确实麻烦
解决方案六:
只要设置Anchor就行了,不知道你试的什么
解决方案七:
设置Anchor属性就可以了
解决方案八:
Anchor,Dock足矣
解决方案九:
设置Anchor属性
解决方案十:
简要步骤如下:1.创建C#窗体程序项目2.Panel放置到窗体3.设置dock属性为fill4.注意MinnumSize不能设置为0,必须大于0publicpartialclassFrmDemo:Form{doubledFrmWidth;doubledFrmHeight;doubledZoomHorizon;doubledZoomVerticality;Dictionary<string,string>dicControlsAttribute=newDictionary<string,string>();protectedvoidGetAllInitiateContrlInfo(ControlCrlContainer){if(CrlContainer.Parent==this){dFrmWidth=Convert.ToDouble(CrlContainer.Width);dFrmHeight=Convert.ToDouble(CrlContainer.Height);}foreach(ControliteminCrlContainer.Controls){if(item.Name.Trim()!="")dicControlsAttribute.Add(item.Name,(item.Left+item.Width/2)+","+(item.Top+item.Height/2)+","+item.Width+","+item.Height+","+item.Font.Size);if((itemasUserControl)==null&&item.Controls.Count>0)GetAllInitiateContrlInfo(item);}}privatevoidChangeControlsInitiate(ControlCrlContainer){dZoomHorizon=(Convert.ToDouble(CrlContainer.Width)/dFrmWidth);dZoomVerticality=(Convert.ToDouble(CrlContainer.Height)/dFrmHeight);}privatevoidChangeCurrentControlAttr(ControlCrlContainer){double[]dPosition=newdouble[5];foreach(ControliteminCrlContainer.Controls){if(item.Name.Trim()!=""){if((itemasUserControl)==null&&item.Controls.Count>0)ChangeCurrentControlAttr(item);string[]strs=dicControlsAttribute[item.Name].Split(',');for(intj=0;j<5;j++){dPosition[j]=Convert.ToDouble(strs[j]);}doubleitemWidth=dPosition[2]*dZoomHorizon;doubleitemHeight=dPosition[3]*dZoomVerticality;item.Left=Convert.ToInt32(dPosition[0]*dZoomHorizon-itemWidth/2);item.Top=Convert.ToInt32(dPosition[1]*dZoomVerticality-itemHeight/2);item.Width=Convert.ToInt32(itemWidth);item.Height=Convert.ToInt32(itemHeight);//item.Font=newFont(item.Font.Name,float.Parse//((dPosition[4]*Math.Min(dZoomHorizon,dZoomVerticality)).ToString()));//字体也可以实现同比放缩。}}}protectedoverridevoidOnSizeChanged(EventArgse){base.OnSizeChanged(e);if(dicControlsAttribute.Count>0){ChangeControlsInitiate(this.Controls[0]);ChangeCurrentControlAttr(this.Controls[0]);}}publicFrmDemo(){InitializeComponent();GetAllInitiateContrlInfo(this.Controls[0]);//构造函数里面调用即可。}}
解决方案十一:
引用2楼spf11045的回复:
还是会重叠啊
你需要自定义机制,让内容按照比例定位,而不是按照像素定位。例如可以定义这样的“扩展方法”publicstaticvoidGridAgent(thisControlp,floatAbsLeft,floatAbsTop,floatAbsWidth=0.35F,floatAbsHeight=0.1F){varform=p.FindForm();varproc=newAction(()=>{if(AbsLeft>0.01)p.Left=(int)(form.Width*AbsLeft);if(AbsWidth>0.01)p.Width=(int)(form.Width*AbsWidth);if(AbsTop>0.01)p.Top=(int)(form.Height*AbsTop);if(AbsHeight>0.01)p.Height=(int)(form.Height*AbsHeight);});proc();form.Resize+=(s,e)=>proc();//当窗口大小改变时,重复执行}
它能够让任意Control,在窗体修改大小时,自动按照“百分率”来调整位置。
解决方案十二:
例如,在用户控件中你可以写privatevoidUserControl1_Load(objectsender,EventArgse){this.GridAgent(0,0,0.3F,0);//宽度保持30%宽,左右高都不设置}
这样就能看到此用户控件宽度总是窗口的的30%宽度。使用ANCHOR和DOCK其实都是绝对像素定位,因此会有弊端!
解决方案十三:
例如窗体中有一个Button控件,那么你可以在窗体代码中写privatevoidForm1_Load(objectsender,EventArgse){this.button1.GridAgent(0,0.5F,0,0);}
这样可以看到,这个button1控件的top总是保持为窗体的高度的一半。我这里只是写一个例子代码,你还可以扩展GridAgent方法,例如告诉它“设置top时还应该减去17个像素”之类的参数。这里说明了,用百分比来设置控件位置,而不是用像素数来设置。
解决方案十四:
privateSizem_szInit;//初始窗体大小privateDictionary<Control,Rectangle>m_dicSize=newDictionary<Control,Rectangle>();protectedoverridevoidOnLoad(EventArgse){m_szInit=this.Size;//获取初始大小this.GetInitSize(this);base.OnLoad(e);}privatevoidGetInitSize(Controlctrl){foreach(Controlcinctrl.Controls){m_dicSize.Add(c,newRectangle(c.Location,c.Size));this.GetInitSize(c);}}protectedoverridevoidOnResize(EventArgse){//计算当前大小和初始大小的比例floatfx=(float)this.Width/m_szInit.Width;floatfy=(float)this.Height/m_szInit.Height;foreach(varvinm_dicSize){v.Key.Left=(int)(v.Value.Left*fx);v.Key.Top=(int)(v.Value.Top*fy);v.Key.Width=(int)(v.Value.Width*fx);v.Key.Height=(int)(v.Value.Height*fy);}base.OnResize(e);}
完全按比例缩放
解决方案十五:
但是我要强调的是,通常这种东西只是对最外层布局控件进行响应式调整,绝不是对内部所有的东西都随便调整。比如说一张图片,如果你胡乱拉伸,那么就变得很丑了。如果是按钮,如果把高度拉高、或者宽度拉宽,那么按钮中的文字周围的空白就突然显得很不协调,一点美感都没有了。.......如果一大堆控件都胡乱改变Width、Height,其实是很垃圾的界面,一看就是程序员做的,而不是美工设计的界面。因此这种方式其实不常使用,仅仅对窗体下面最外层的布局控件使用,这样才不至于让一堆很具体的控件变形。仅对布局控件使用百分比的定位方式,然后布局控件里边的内容还是使用ANCHOR和DOCK。
解决方案:
我们拿#13楼贴的那个简单布局图做了例子来说明。使用Anchor时,设置了ListBox向左、向上、向右、向下对齐。而两个Button仅需要向上对齐。这样就能在窗体拉伸时比较美观,也根本不会出现你说的那种“左右空一大截”的现象。你看到空了一大截,一定是没有设置好ListBox向对齐。因此Dock和Anchor是最常需要用到的。但是,我们可能希望ListBox的宽度不要超过窗体宽度的90%,超过了就不协调了。这就是Anchor做不到的了。例如我们希望窗体内部分为左右两部分、左边占80%,右边占20%,然后按钮宽度和ListBox分别自动地使用Anchor向各自的容器的对齐。实际上在WPF/Silverlight中具有很智能的按比例分割屏幕的功能。Winform毕竟是20年以前就设计完成UI的架构(在vb中就有了Anchor等机制),而WPF是13年前研发的UI架构,自然是后者在布局上比较先进。