DevExpress 学习使用之 SplitContainerControl
无论是 .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的更多相关文章
- DevExpress学习01——下载与安装
记得刚接触编程时,虽然实现了功能,但用户界面十分丑陋,老师叫我们美化一下界面,不要千篇一律,当时觉得能够写出来功能就洋洋得意了,不觉得界面丑陋.后来,在程序比赛中,我接触了一种第三方控件,它可以快速实 ...
- DevExpress学习系列(控件篇):GridControl的基本应用
一般属性设置 不显示分组框:Gridview->Option View->Show Group Panel=false 单元格不可编辑:gridcontrol -->gridview ...
- DevExpress学习笔记1-ProductsDemo.Win
最近在学习ProductsDemo.Win,有一些体会记录下来,大家分享: 在Contacts模块: 在Private Sub UpdateCurrentContact()过程添加一句:InitInd ...
- DevExpress学习1
为了程序的美观设计,决定用dev控件. 第一步,去官网下载了试用30天的安装包,官网地址:https://www.devexpress.com/,安装完成. 第二步,开始程序下找到DevExpress ...
- DevExpress 学习使用之 TreeList
1. 必须先添加列,否则不能显示任何节点内容 2. 如果是代码添加列时,一定要写明 VisibleIndex = 几,没有这句,不显示 3. 顶级结点用 TreeList.AppendNode 来添加 ...
- DevExpress 学习使用之 Skin
新建了一个XtraForm,设置属性里的皮肤属性却不能实现,群里朋友发过来一个简单的换肤项目 1. 先觉条件似乎是窗体应该继承“public partial class XtraForm1 : Dev ...
- DevExpress 学习使用之 PrintSystem
这是来自群里边的一段,收集起来,碎片知识是很珍贵的. 傷心孤影(2072201) 16:14:41导出excel加标题用PrintableComponentLink小宝(462561442) 1 ...
- DevExpress学习笔记之如何获取Repository Item的值
上一章我们看到了如何在TreeList的单元格中动态绑定不同的控件,此类控件被称为In_Place Control.所谓“In_Place”,我的理解为“内置”控件,既然有“内”就相对的会有“外”,其 ...
- c# devexpress学习绘图
用字典方式存储数据并绘图:http://www.xuebuyuan.com/465384.html 数据库存储数据,并对图形作各种设置:http://www.cnblogs.com/xuhaibiao ...
随机推荐
- 重写ArcGIS的TiledMapServiceLayer呼叫世界地图图块
require(["esri/layers/TiledMapServiceLayer"], function () { dojo.declare("com.Str ...
- SQL ROW_NUMBER() OVER函数的基本用法用法
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW ...
- C#按LastID进行分页——与lambda形成链式
public static class PageHelper { /// <summary> /// 按页码分页 /// </summary> /// <param na ...
- 教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题)
原文:教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题) 之前发布过Silver ...
- ThinkPHP神秘应用架构扩展
ThinkPHP应用模式提供了机会,改变核心框架.它可以让你的应用程序,以适应环境和其他许多不同的需求. 每一个应用模式都有自己的模式定义文件,相对与ThinkPHP3.1版本号.ThinkPHP3. ...
- java学习笔记1——window7下JDK环境变量配置图解
1. 首先下载Java安装工具包 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
- Java用ZIP格式压缩和解压缩文件
转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...
- Swift入门教程:基本语法(四)
可选类型 可选类型的使用场合 当一个值可能存在,可能不存在的时候,就用可选类型 比如查找字符k在某个字符串中的位置 如果字符串是"jake",说明k的位置存在,是2 如果字符串是& ...
- web学习总结之布局
浅谈web布局中的“float”属性 对于刚学习web前端的同学,布局和排版都是一个难点.虽然我们能够通过各种调试实现我们希望得到的页面效果,但是如果不把其中的道理弄清楚的话,在下次布局的时候,也无法 ...
- Git的使用学习资源
开学第一天一般都挺认真的,认真做个功课. 跟据Ryan Tang的推荐,有两个比较好的学习Git的网站:http://git.gitcafe.com/book/zh 还有一个是CodeSchool的一 ...