C#里winform最大化时,如何使里面的控件按比例变化?

问题描述

用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架构,自然是后者在布局上比较先进。

时间: 2024-08-02 07:02:42

C#里winform最大化时,如何使里面的控件按比例变化?的相关文章

winform中窗体最大化时 如何使窗体中内容也相应的全屏

问题描述 请教大家,winform中窗体最大化时如何使窗体中内容也相应的全屏? 解决方案 解决方案二:设置控件的Anchor属性或Dock属性解决方案三:这个很麻烦,不好处理,我也曾经尝试着根据窗体大小的比例,来改变组件的位置,失败了,老师也没有办法,解决方案四:引用1楼ojlovecd的回复: 设置控件的Anchor属性或Dock属性 正解解决方案五:引用3楼freeboy827的回复: 引用1楼ojlovecd的回复:设置控件的Anchor属性或Dock属性正解 但是界面不一定会好看了解决方

C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

  这篇文章主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下 特别是针对循环或timer处理中需要在窗体控件显示数据时,因后台处理过度繁忙而出现没刷新或者假死现象时,可以使用 代码如下: Application.DoEvents(); Application.DoEvents()的作用 代码如下: private void

mfc-MFC怎样使对话框缩小控件随之缩小

问题描述 MFC怎样使对话框缩小控件随之缩小 搜了很多资料都是关于让对话框变大时,控件随之改变的,但是没有对话框缩小时控件随之缩小的.请问如果我要缩小对话框,并想让控件随之缩小,怎么做? 解决方案 响应OnSize根据新的大小重新计算各控件位置和大小,不管是放大还是缩小方法是一样的 解决方案二: codeproject上搜索EASYSZIE比较容易.原理都是在父窗口类的WM_SIZE消息的响应函数OnSize中去MoveWindow/SetWindowPos()子控件的显示区域位置.

WinForm中类似WebForm中的CheckBoxList控件

web|控件 前些天,在.Net技术的论坛里面看到了有个帖子,我好像记得是怎么实现WinForm中类似WebForm中的CheckBoxList控件,我简单的实现了那样的一个控件 首先,你得建立一个控件项目,假如说是: 接着,你就添加一个类:CheckBoxCollection,它是个CheckBox的集合类 具体的代码如下 CheckBoxCollection.cs using System;using System.Collections;using System.Windows.Forms

wpf c#-有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢

问题描述 有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢 有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢 我将一个异步生成的对象赋给了控件,提示以下异常: "必须在与 DependencyObject 相同的线程上创建 DependencySourc" 根据异常的提示 创建数据源与创建控件不是同一个线程,所以无法作为其数据源,请问有什么方法使得异步里创建的对象能够作为控件的数据源进行绑定.. //异步调用的方法: private vo

图片-怎么在选择时间时,让前面的单选按钮取消选中,而点击单选时,后边的日期控件回复为默认

问题描述 怎么在选择时间时,让前面的单选按钮取消选中,而点击单选时,后边的日期控件回复为默认 如图:怎么在选择时间时,让前面的单选按钮取消选中,而点击单选时,后边的日期控件回复为默认 解决方案 选中了哪个,记住它用一个变量,点击日期时,就让他取消勾选单选的点击动作你是肯定能知道的,所以点击时去访问日期组件,并设置日期 解决方案二: 1 为单选按钮添加点击事件,点击时设置日期控件的值为默认值:2 为日期控件添加focus事件,将单选按钮的选中属性设置为false. 解决方案三: 根据选定的结果进行

vb.net 控件backgroundcolor为半透明时,如何让其它控件也半透明显示?

问题描述 vb.net 控件backgroundcolor为半透明时,如何让其它控件也半透明显示? Label1.BackColor = Color.FromArgb(100 0 0 0) 这样做以后只让窗体的背景图片半透明显示了,而其它控件却被遮盖了.(图片为窗体背景)怎么让控件也半透明地显示出来? 解决方案 http://blog.csdn.net/sxycgxj/article/details/6114798http://download.csdn.net/download/zenas/1

100个chart控件实时绘图时,单击单个chart控件显示每个chart控件的放大曲线时总是滞后

问题描述 100个chart控件实时绘图时,单击单个chart控件显示每个chart控件的放大曲线时总是滞后 我有100个chart控件组成的数据采集界面,一段时间要对这100个单独的chart控件进行数据绘图,单独点击某一个chart控件还能看到每一个chart控件的放大曲线图,遇到的问题就是:恰好在对100个chart控件同时进行绘图时,此时单击任何一个chart控件都会卡住,只到100个chart的绘图过程结束,单个chart的放大界面曲线才能看到,有什么办法能让这两个过程互不影响吗?线程

wpf窗口拖拽时 窗口内的一个控件的数量会随着 区域的大小而改变

问题描述 wpf窗口拖拽时 窗口内的一个控件的数量会随着 区域的大小而改变 WPF窗口在拖动时 怎样做到窗口中的控件的数量会根据区域的大小而变化 啊? 比如我窗口本来有一张图片 当窗口拉大时 显示3张图片. 有用到过的吗?? 解决方案 用UniformGrid布局http://www.cnblogs.com/libaoheng/archive/2011/11/19/2255558.html