• 如果有UI部分可以复用,那么可以单独设置为一个UserControl或者一个自定义子类控件

    • 如果是单一一个控件,只是继承并修改了默认控件的样式行为,那么可以直接创建一个class并继承该控件,缺点是Designer中不可见
    • 如果是一组控件或者说一个区域,可以创建一个UserControl,并且在Designer中自行做界面设计
    • 即使做成了一个UserControl或自定义子类控件,在外层Form等父控件中使用时,Size还是要重新设置,就像使用Winform自带的控件一样。因此在这个UserControl或自定义子类控件中,根据Size做的设置,都要注意一下自适应度了。
  • WinForm中没有z-index的概念,同一级的控件直接根据位置大小进行覆盖
    • 小心动态调整布局或大小时,发生控件之间的遮罩情况
  • 利用Panel、Dock和Anchor属性进行自适应布局
    • 举个简单的例子来说,如果一个Form由上中下三个Panel组成,那么上下两个Panel可以设置为特定高度、Dock为Top和Bottom,然后中间的Panel要设置为Dock为Fill,那么中间的Panel就可以自适应高度了,但是在Designer中需要右击选择BringToFront,否则可能中间这个Panel的高度会包含上面或下面的Panel的高度。
    • Dock和Anchor属性可以通过位运算符&等进行组合。
  • 做UI时,尽量保证Designer模式是可见、可用的
    • 好处是方便进行总体布局、后期修改,不然有个东西显示不出来,都看不出来是为什么,比如被谁挡住了。。。否则只能通过设置背景色后再运行观察了
    • 保证Designer.cs中的代码符合vs的规则和顺序,免得自己直接改Designer.cs文件导致莫名其妙的问题,比如.BeginInit()、SuspendLayout()、((System.ComponentModel.ISupportInitialize)(this.dgvDataSourceSearchHistory)).EndInit();、this.ResumeLayout(false);this.PerformLayout();等的顺序
    • 避免在Designer.cs中使用单例模式、自定义构造函数、泛型。前两个可以延迟到.cs文件中在构造函数调用InitializeComponent()后再做;泛型可以考虑用自定义类、object代替。
    • 在Designer模式中修改,也比较容易看到默认的margin等东西、设置颜色代码等,也容易在不同控件间切换、选择(Esc键可以选中上一级控件)。
    • 即使使用了多语言或者动态填充数据,也要保证空白控件在Designer模式可见,至少方便弄size、location、布局。
  • 控件之间的通信(一个父控件包含两个子控件为例)
    • 父控件通知子控件:直接调用子控件函数
    • 子控件通知父控件:子控件定义和在自身事件中调用该事件,父控件订阅和实现该事件,在父控件中进行事件绑定/订阅。
    • 子控件之间:主动调用的控件定义和自身事件中调用该事件,另一个控件订阅和实现该事件,在父控件中进行事件绑定/订阅。
    • 类似的,如果要使用子控件的子控件,直接将其设为public。
  • 如果有一些设置是通用的(比如某个颜色),那么如果想兼顾Designer可视化和代码可维护性,可以既在Designer中设置该值,也在代码中的构造函数中使用全局变量再设置一次该值?
  • 一个Form中的各级子控件的默认背景色(只是panel?),均继承自上级panel(form的背景色无效?)

WinForm心得的更多相关文章

  1. WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信

    原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...

  2. RFID的winform程序心得2

    RFID的winform程序心得1 webBrowser1.AllowWebBrowserDrop = false;//将 WebBrowser 控件的 AllowWebBrowserDrop 属性设 ...

  3. RFID的winform程序心得1

    /// 根据日期获取当周星期一 /// </summary> /// <param name="dt"></param> /// <ret ...

  4. winform 开发心得~

    winform自适应不同分辨率 不同dpi 1.窗体AutoScaleMode属性 使用None 2.自定义控件 AutoScaleMode 使用Inherit 3.所有控件窗体字体使用px为单位

  5. C#winform菜单权限分配,与菜单同步的treeView树状菜单权限控制使用心得

    在网上查了很多,发现没有讲述关于--C#winform菜单权限分配,与菜单同步的treeView树状菜单权限控制使用--的资料 自己研究了一个使用方法.下面来看看. 我有两个窗体:LOGINFRM,M ...

  6. C# WinForm 第一个项目控件使用心得

    1.控件心得 1.1 基础控件 panel 作用:布局 难点:重绘边框改变颜色 重绘panel里如果有fill填充控件 panle的padding要改个值 private void pnlPaintB ...

  7. C# winform 编程 向ACCESS数据库导入EXCEL表使用心得

    public string MyConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ErLake.mdb&quo ...

  8. Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解

    最近一直在整合WebAPI.Winform界面.手机短信.微信公众号.企业号等功能,希望把它构建成一个大的应用平台,把我所有的产品线完美连接起来,同时也在探索.攻克更多的技术问题,并抽空写写博客,把相 ...

  9. WCF学习心得----(四)服务承载

    WCF学习心得----(四)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

随机推荐

  1. Eclipse weblogic 中文乱码问题解决办法

  2. Subversion Self Signed Certificates

    When connecting to Subversion repositories using SSL connections the SVN client checks the server ce ...

  3. UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存

    如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null.这是UNITY内部的一个处理技巧.关于这个技巧有很争 ...

  4. 【311】Python 构建 ArcMap 标注表达式

    参考:构建标注表达式(官方帮助) 参考:计算字段示例(官方帮助) 说明:以上两者的方法略有不同,一个是通过字段表达式显示标注,一个通过字段计算新的字段,使用的工具方法也不同,前者通过 Layer.la ...

  5. input子系统分析之三:驱动模块

    内核版本:3.9.5 本节将以even handler来分析设备的注册和打开的过程,分析之前不妨回顾一下上节介绍的数据结构. 结合前两节分析可知,input子系统分为3层,最上一层是event han ...

  6. EF CodeFirst简单实例

    运行环境:VS2012,添加的EntityFramework为6.0.2 版本不用太关心,只要知道原理就行了: 基本代码就这几行: namespace ConsoleApplication1 {    ...

  7. cocos2dx 屏幕分辨率问题

    做手机上的软件首先要考虑的就是屏幕分辨率怎么解决.coco2dx已经有了很好的解决方法. 用cocos2dx的python脚本创建工程时默认生成一个Helloworld的demo.我们就以这个demo ...

  8. ajax获取json数据为undefined--原因解析

    解决办法:var dataObj=eval("("+data+")");//转换为json对象 问题: 1. 碰到一个问题ajax成功获取json数据后,取值显 ...

  9. 5-SOM神经网络

    https://blog.csdn.net/gavinlyy/article/details/8302814 https://blog.csdn.net/u011314012/article/deta ...

  10. LinuxSystemProgramming-vi

    Basic VI