无论是 .net framework 自带还是第三方组件,使用 Split 类控件时通常其 Panel 中都会包含多个子控件,在运行时不可避免遇到因改变 splitter 位置或改变窗体大小引起的界面重绘,此时都会希望自己的程序运行的又快又稳,前两天就这个问题在 Q 群和 MSDN 论坛上提出了疑问,并很快得到解答,下面将经验做个分享。

先说一开始写的不对的地方,开始我使用的是 SplitterMoving 和 SplitterMoved 这两个事件,这两个事件 .net 自带的 splitContainer 和 DevExpress 的 splitContainerControl 都有。在 SplitterMoving 中将两个 Panel 做“挂起”—— splitContainerControl.Panel1.SuspendLayout(),并在 SplitterMoved 事件中将 Panel 恢复—— splitContainerControl.Panel1.ResumeLayout(true),兴奋的去测试,结果发生了尴尬的事情:窗体运行后,先进行一次 splitter 位置的改变,然后最大化窗体,Panel 中的子控件仍然保持最大化之前的大小,就像 Dock.Fill 失灵了一样。

改变一次 splitter 位置,并将窗体最大化后,空白出现了

马上查资料,百度一通,都是讲 SuspendLayout 可以干嘛的,没有发现有谈到这种问题的,求助于 MSDN 论坛获得解答:SuspendLayout 和 ResumeLayout 是“成对”产生作用,即 Suspend 一次就需要 Resume 一次。在图中可以看到,拖动 splitter 将触发 N 次的 SplitterMoving 事件,也就是产生了 N 次 Panel1.SuspendLayout(),但 Panel1.ResumeLayout 只有一次,造成了恢复布局的失败。

两种解决方式:

第一、用代码解决,定义一个变量放入事件,使 SuspendLayout 只执行一次

         bool _suspend = false;
private void splitContainer1_SplitterMoving(object sender, SplitterCancelEventArgs e)
{
if (!this._suspend)
{
splitContainer1.SuspendLayout();
this._suspend = true;
}
} private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
this._suspend = false;
splitContainer1.ResumeLayout();
}

第二、在 DevExpress 的控件里使用其独有的 BeginSplitterMoving 和 SplitterPositionChanged 事件的组合,这两个事件都只会触发一次,所以不会产生不成对的问题。

DevExpress 学习使用之 SplitContainerControl的更多相关文章

  1. DevExpress学习01——下载与安装

    记得刚接触编程时,虽然实现了功能,但用户界面十分丑陋,老师叫我们美化一下界面,不要千篇一律,当时觉得能够写出来功能就洋洋得意了,不觉得界面丑陋.后来,在程序比赛中,我接触了一种第三方控件,它可以快速实 ...

  2. DevExpress学习系列(控件篇):GridControl的基本应用

    一般属性设置 不显示分组框:Gridview->Option View->Show Group Panel=false 单元格不可编辑:gridcontrol -->gridview ...

  3. DevExpress学习笔记1-ProductsDemo.Win

    最近在学习ProductsDemo.Win,有一些体会记录下来,大家分享: 在Contacts模块: 在Private Sub UpdateCurrentContact()过程添加一句:InitInd ...

  4. DevExpress学习1

    为了程序的美观设计,决定用dev控件. 第一步,去官网下载了试用30天的安装包,官网地址:https://www.devexpress.com/,安装完成. 第二步,开始程序下找到DevExpress ...

  5. DevExpress 学习使用之 TreeList

    1. 必须先添加列,否则不能显示任何节点内容 2. 如果是代码添加列时,一定要写明 VisibleIndex = 几,没有这句,不显示 3. 顶级结点用 TreeList.AppendNode 来添加 ...

  6. DevExpress 学习使用之 Skin

    新建了一个XtraForm,设置属性里的皮肤属性却不能实现,群里朋友发过来一个简单的换肤项目 1. 先觉条件似乎是窗体应该继承“public partial class XtraForm1 : Dev ...

  7. DevExpress 学习使用之 PrintSystem

    这是来自群里边的一段,收集起来,碎片知识是很珍贵的.  傷心孤影(2072201)  16:14:41导出excel加标题用PrintableComponentLink小宝(462561442)  1 ...

  8. DevExpress学习笔记之如何获取Repository Item的值

    上一章我们看到了如何在TreeList的单元格中动态绑定不同的控件,此类控件被称为In_Place Control.所谓“In_Place”,我的理解为“内置”控件,既然有“内”就相对的会有“外”,其 ...

  9. c# devexpress学习绘图

    用字典方式存储数据并绘图:http://www.xuebuyuan.com/465384.html 数据库存储数据,并对图形作各种设置:http://www.cnblogs.com/xuhaibiao ...

随机推荐

  1. javascript系列之DOM(三)---事件

    原文:javascript系列之DOM(三)---事件 事件是javascript跳动的心脏,是DOM所有成分结合的万金油.当我们在WEB 上进行某些交互时,事件也就发生了.点击某些内容,鼠标经过特定 ...

  2. jquery 访问控制菜单

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpqOTExOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  3. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)

    本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...

  4. UVA11627-Slalom(二分法)

    题目链接 题意:有n个宽为w的旗门,第i个旗门左端的坐标为(xi, yi),对于全部1 <= i < n满足yi < y(i+1).你有s双滑雪板,第j双的速度为sj(垂直向下的速度 ...

  5. Swift语言指南(三)--语言基础之整数和浮点数

    原文:Swift语言指南(三)--语言基础之整数和浮点数 整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,3 ...

  6. C# winform调用WebBrowser经典怪问题总结

    原文:C# winform调用WebBrowser经典怪问题总结 最近一直研究网页数据采集,单单采集数据,其实HtmlAgilityPack就足够了. 对HtmlAgilityPack感兴趣的可以到这 ...

  7. API接口开发简述示例

    作为最流行的服务端语言PHP(PHP: Hypertext Preprocessor),在开发API方面,是很简单且极具优势的.API(Application Programming Interfac ...

  8. window批量-6 rem

    行动: 凝视命令,加大对批量处理相应的描述性信息 格公式: rem [comment] demo: bat @echo off pause rem 这是对pause的解释 echo xxx pause ...

  9. SQL点滴26—常见T-SQL面试解析

    原文:SQL点滴26-常见T-SQL面试解析 它山之石可以攻玉,这一篇是读别人的博客后写下的,不是原原本本的转载,加入了自己的分析过程和演练.sql语句可以解决很多的复杂业务,避免过多的项目代码,下面 ...

  10. UC编程:字符读取与行读取

    字符读取函数的应用 下面的演示程序实现从/etc/passwd文件中提取用户名,打印到屏幕上并保存在copyname.txt文件中 使用的函数是getc().putc().putchar() [c] ...