WinForm界面布局_第1页
WinForm界面布局_第2页
WinForm界面布局_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Win Form界面布局Dock & AnchorDock和Anchor是水火不容的,同时给控件设置Dock和Anchor属性时后设置的会覆盖前面的设置。Dock我初接触 Win Form的时候发现控件的 Width和Height只能是int,不能设置为百分比, 那个 时候就想子控件如何跟着父控件而变化呢?父控件变大就变大,而且还填满那个区域。甚至以为这个需要通过代码来解决,如是在SizeChanged事件里 后来才发现我要的就是Dock给的,Dock是停靠的意思。Dock属性的类型是 DockStyle枚举:1: public enum DockStyle2: 3:None = 0,

2、4:Top = 1,5:Bottom = 2,6:Left = 3,7:Right = 4,8:Fill = 59: 默认是None,当为Left的时,就表示子控件停靠在父控件的左边区域,并把左区域填充满:上图中的Panel总是会停靠在Form的左边区域,不管如何调整 Form的高度,它总是能把 左边区域填满。Dock麻烦的地方在于多个控件碰到一起时,比方有两个Panel都设置为Left该怎么办?我们会发现向父控件的Controls集合中添加子控件,越晚添加具有更高的优先级不知道有没有这个说法,这是我杜撰的。这里的优先级指的是,子控件优先级越高,越靠近父控件边缘,其他子控件就得避让:我的见解;

3、通过选中控件,一般是pannel,右键选择置为底层,来决定控件间的优先级this.C on trols.Add(this.pa nell);this.Co ntrols.Add(this.pa nel2);Panel2后添加进去,所以它具有更高的优先级,更靠近Form的边缘。这个规那么不仅仅对于Dock都设为Left的有效,对 Dock属性不同,但是碰到一起的子控件也适用:1: this.panel1.Dock = DockStyle.Left;2: this.panel2.Dock = DockStyle.Left;3: this.panel3.Dock = DockStyle.Top;4:

4、5: this.Controls.Add(this.panel1);6: this.Controls.Add(this.panel2);7: this.Controls.Add(this.panel3);panel3的Dock设置为Top,最后添加到Controls集合中,所以具有最高的优先级,其他两个panel都得避让:将Panel3调整成第二个添加进去呢?却是这番景象:当然,这里的 优先级比拟只在同一个 层次起作用,将子控件与父控件同一层次的控件相 比拟是没有意义的。AnchorDock 般是划分区域的,将一个窗体或大控件划分几个大区域以便布局,就像Web中的div一样。但有的时候我们却想

5、子控件在父控件里的相对位置不要随着父控件的变大缩小而变 化,或者控件边缘距离父控件边缘的相对距离不要发生变化,但又不是停靠在父控件的边缘,这就是Anchor该出场的时候了。Anchor属性的类型是 AnchorStyles位标记如果不理解位标记就将其理解为可以使用位运 算符进行操作,从而可以设置多个值的枚举吧,深入理解请参见MSDN或?CLR via C#?中对位标记的描述:1: Flags2: public enum AnchorStyles3: 4:None = 0,5:Top = 1,6:Bottom = 2,7:Left = 3,8:Right = 49: Anchor的默认值是 An

6、chor.Left | Anchor.Top ,也就是子控件与父控件的左边缘和上边缘的相 对位置不会变化,这也保证了在窗体最大化后子控件的位置不会发生变化:窗体默认显示时->窗体变大后->还是悬停在左上角不会发生变化。那如果设置为Left和Right呢?当Anchor设置为Left|Right的时候,为了确保父控件在这里就是Form变大时,控件的边缘与父控件距离不变,子控件会自动的扩大:总之,记着Anchor的中文意思:锚。当给控件设置 Anchor的时候,就相当于用一个铁钉将 控件的边缘给钉住。Padding & MarginPadding和Margin没有什么好说的,和

7、 CSS的盒模型描述的一模一样,Padding指的是控件内部空间,Margin指的是控件之外的:padding和margin都可以指定四个值。AutoSize有的时候我们需要控件随着里面的内容的增长而增长,比方在做多语言的程序时,各国的语言描述同一个意思的时候长度会不同,这个时候就需要AutoSize为true 了,这样当文字过长不会被截断。关于 AutoSize更详细的内容请参见 MSDN。如何面对复杂界面?出了问题咋办?设计时当界面变得越来越复杂的时候,我们很期望了解控件之间的层次关系,这个按钮是放在哪个Panel上?这个Pa nel的区域又是咋样的。我刚接触Win Form的时候,我非常

8、期望 WinForm上也有类似于IE Developer Toolbar的工具,点击 HTML,可以可视化的在界面上显示区域, 在界面上选中某区域,也可以定位到HTML元素。实际上在设计 WinForm界面时也是可以的。这就是 Visual Studio 的 Document Outline 窗口( View->Other Windows->DocumentOutline):加TTirtQjDKi.伽"Dodhm-二糾fl #r*二 pttC 険btW li»不过如果你只想顺着 button1->panel4->panel3- >这条线导航控件

9、树,有更方便的方法:ESC键。选中一个控件,然后敲ESC键就会顺着这个控件层次不断的上溯。选中一个控件,然后点击右键,还会出现Select 的菜单,可以选中该控件的某个父控件:pCd1固View CMCiBnAgec FfcfltJ勺1仙亡忆鼬让Ali-gn to ynd0HockCcrttPoEsiMftelJ阳 tet p<rwQVekctfMncnSfkCl gfhtgE真是够方便的运行时不过有个问题是,上面的方法都是设计时的,有的时候我们的程序中如果动态的修改了某些涉及布局的属性最后发现界面乱套了,这可咋整。运行时的问题当然要运行时解决,给某个父控件附加Layout事件,当修改了

10、涉及 Layout的属性时会触发这个事件也有特例,下一节介绍。这个事件会有一个 LayoutEventArgs参数,该参数有 AffectedProperty属性,该属 性指示的就是影响布局的罪魁祸首,你就找到病症所在了。SuspendLayout & ResumeLayout我想大家对这两个方法肯定不默认,几乎在WinForm里的InitializeComponent方法里,在方法开始处有会调用 SuspendLayout方法,然后在方法快结束处会调用ResumeLayout方法。有些的读者也许还尝试过删除这两个方法,发现程序表现行为和以前也一样。了解这两个方法对 WinForm程序

11、的性能还是挺有帮助的,在上一节提到修改涉及Layout的属性时会触发Layout事件,但是有特例,特例就是调用了SuspendLayout方法,关于修改哪些属性会触发 Layout事件请查阅 MSDN。在代码中如果修改 Size、Dock等属性或向父控 件添加子控件时,会执行布局逻辑,有的时候甚至会重绘。当我们要修改一堆的这样的属性 时,比方前面提到的InitializeComponent方法,我们当然不想修改一下就执行一次布局逻辑, 那太慢了。这个时候在修改之前你就可以调用SuspendLayout方法挂起布局逻辑,等所有属性都设置好后再调用 ResumeLayout属性,特别是在界面很复杂的时候性能有很大的提升。Visual Studio默认将设置这些属性的语句全部放在InitializeComponent方法里,然后用SuspendLayout和ResumeLayout括住,所以我们一般不要自作主张的将这些属性移出到外面 设置,不过有的时候我们想在代码里动态生成一些界面,比方添加一些子控件什么的,我们最好也像VS干的那样调用这两个方法。要注意的是,并不是调用了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论