windows from 手风琴
public class OutlookBar : Panel { private int SelectedBandHeight { get; set; } public int ButtonHeight { get; set; } public int SelectedBand { get; set; } public OutlookBar() { ButtonHeight = ; SelectedBand = ; SelectedBandHeight = ; } /// <summary> /// 初始化位置 /// </summary> public void Initialize() { Parent.SizeChanged += new EventHandler(SizeChangedEvent); } /// <summary> /// 添加 /// </summary> /// <param name="text"></param> /// <param name="panel"></param> public void AddBand(string text, Panel panel) { var index = Controls.Count; MainPanel bandPanel = new MainPanel(new Model() { OutlookBar = this, Index = index, Text = text, Panel = panel }); Controls.Add(bandPanel); UpdateBarInfo(); RecalcLayout(bandPanel, index); } /// <summary> /// 选择 /// </summary> /// <param name="index"></param> public void SelectBand(int index) { SelectedBand = index; RedrawBands(); } private void RedrawBands() { ; i < Controls.Count; i++) { MainPanel bp = Controls[i] as MainPanel; RecalcLayout(bp, i); } } /// <summary> /// 更新 /// </summary> private void UpdateBarInfo() { SelectedBandHeight = ClientRectangle.Height - (Controls.Count * ButtonHeight); } /// <summary> /// 重新计算布局 /// </summary> /// <param name="mainPanel"></param> /// <param name="index"></param> private void RecalcLayout(MainPanel mainPanel, int index) { int vPos = (index <= SelectedBand) ? ButtonHeight * index : ButtonHeight * index + SelectedBandHeight; int height = SelectedBand == index ? SelectedBandHeight + ButtonHeight : ButtonHeight; //主面板尺寸 mainPanel.Location = , vPos); mainPanel.Size = new Size(ClientRectangle.Width, height); //计算按钮尺寸 mainPanel.Controls[].Location = , ); mainPanel.Controls[].Size = new Size(ClientRectangle.Width, ButtonHeight); //计算内容尺寸 mainPanel.Controls[].Location = , ButtonHeight); mainPanel.Controls[].Size = , height - ); } private void SizeChangedEvent(object sender, EventArgs e) { Size = new Size(Size.Width, ((Control)sender).ClientRectangle.Size.Height); UpdateBarInfo(); RedrawBands(); } }
手风琴 主体代码
class MainPanel : Panel { public Model model { get; set; } public MainPanel(Model obj) { this.model = obj; Button btn = new Button() { Text = obj.Text, FlatStyle = FlatStyle.Standard, Visible = true }; btn.Click += new EventHandler(SelectBand); this.model.Panel.AutoScroll = true; this.model.Panel.Dock = DockStyle.Fill; Controls.Add(btn); Controls.Add(this.model.Panel); } private void SelectBand(object sender, EventArgs e) { model.OutlookBar.SelectBand(model.Index); } }
主体Panel
class Model { public OutlookBar OutlookBar { get; set; } public int Index { get; set; } public string Text { get; set; } public Panel Panel { get; set; } }
实体类
private void DataBindBar() { outlookBar.Initialize(); var panel1 = new TableLayoutPanel(); var panel2 = new TableLayoutPanel(); var panel3 = new TableLayoutPanel(); outlookBar.AddBand("工具条A", panel1); outlookBar.AddBand("工具条B", panel2); outlookBar.AddBand("工具条C", panel3); ; i <= ; i++) { panel1.Controls.Add(new Button() { Text = i.ToString() }); } ; i <= ; i++) { panel2.Controls.Add(new Button() { Text = i.ToString() }); } ; i <= ; i++) { panel3.Controls.Add(new Button() { Text = i.ToString() }); } outlookBar.SelectBand(); }
调用方式
效果图:
windows from 手风琴的更多相关文章
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- Windows Server 2012 NIC Teaming介绍及注意事项
Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...
- C# 注册 Windows 热键
闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- 在离线环境中发布.NET Core至Windows Server 2008
在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...
- Windows平台分布式架构实践 - 负载均衡
概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- 1.初始Windows Server 2012 R2 Hyper-V + 系统安装详细
干啥的?现在企业服务器都是分开的,比如图片服务器,数据库服务器,redis服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...
随机推荐
- mac os X下的updatedb
unix或linux下使用locate指令在其数据库中查询文件,使用updatedb可以 更新locate的数据库.而在mac os X下却找不到updated这个程序.使用 man locate查看 ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- 06 Activity显示跳转
<span style="font-size:18px;">package com.fmy.day8_29task; import com.fmy.day8_29tas ...
- 最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))
===================================================== 最简单的基于FFmpeg的视频编码器文章列表: 最简单的基于FFMPEG的视频编码器(YUV ...
- UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
/* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( in ...
- Unity插件 - MeshEditor(二) 模型网格编辑器(高级)
源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 继先前的一篇MeshEditor之后,MeshEditor第二版发布,这次在先前的基础上加入了为模型新增顶点以及删 ...
- React Native入门教程 1 -- 开发环境搭建
有人问我为啥很久不更新博客..我只能说在学校宿舍真的没有学习的环境..基本上在宿舍里面很颓废..不过要毕业找工作了,我要渐渐把这个心态调整过来,就从react-native第一篇博客开始.话说RN也出 ...
- 程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理
原帖地址:http://www.cnblogs.com/buaashine/archive/2012/11/12/2765691.html 1.注意这是cocos2d-x中的函数,但大体上和cocos ...
- 四大组件之Service小结
总结提高,与君共勉! 1.Service是什么 Service 是看不到界面的,,就是一个没有界面的Activity, 并且长期在后台运行的一个组件.. 由于ANR对Activity和Broadcas ...
- jdbc连接sql数据库
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...