无论是 .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. Android研究之游戏开发处理按键的响应

    1.onKeyDown 方法 onKeyDown 方法是KeyEvent.Callback 接口中的一个抽象方法,重写onKeyDown 方法能够监听到按键被按下的事件,我们先看看onKeyDown方 ...

  2. Android Studio怎样更改JDK和SDK的路径?

    这个对于非常多刚转到Android Studio上的来说,确实是一个问题.可能你在设置里面找了非常久都没找到这个选项. 直接上图吧,按下图就能够找到设置的地儿了,然后直接设置到你SDK或者JDK的路径 ...

  3. Unity3D-RPG项目实战(3):整合Visual Studio 2013开发环境

    古人云:工欲善其事必先利其器,IDE尽管属于一个非常上层的工具,可是一个好的IDE对工作效率提高还是非常大的. 事实上我还是满想用一下官方推荐的Mono,毕竟跨平台如今还是非常重要的一个特性.尝试了这 ...

  4. 云server 性能测试web压力测试

    前言:如今,云server主流.它已成为许多中小型企业的首选server,但是云server它是一个虚拟机.所以性能是一个大问题,从这里开始介绍云server性能测试,云webserver压力测试. ...

  5. Appium根据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  6. Oracle 11g sys,system 密码忘记设置解决办法

    原文:Oracle 11g sys,system 密码忘记设置解决办法 1.启动sqlplus 2.请输入用户名:  sqlplus/as sysdba 3.输入口令: 直接回车 4.连接到: Ora ...

  7. mysql utf8mb4与emoji表情

    一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...

  8. Windows在结构objective C开发环境

    对于近期打算iPhone.iPod touch和iPad开发一些应用程序,所以.需要开始学习Objective C(苹果推出的类似C语言的开发语言).因为苹果的自我封闭的产业链发展模式(从芯片.机器. ...

  9. SSH简介

    一.什么是SSH? Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上 ...

  10. C# 语言的两个html解析器

    基于C# 语言的两个html解析器   基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocu ...