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服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...
随机推荐
- 如何查看Android设备上的分区信息
Android设备上,一般都会存在一块eMMC存储芯片来存放系统和用户数据,甚至部分的引导程序. 一般设备出厂时,各个厂商都会将这块存储芯片分成很多的分区,每个分区内存放不同的内容.具体分区的布局每个 ...
- Java数据类型及类型转换
http://blog.csdn.net/pipisorry/article/details/51290064 java浮点数保留n位小数 import java.text.DecimalFormat ...
- 套接字工厂——ServerSocketFactory
接收器Acceptor在接收连接的过程中,根据不同的使用场合可能需要不同的安全级别,例如在支付相关的交易就必须对信息加密后再发送,这其中还涉及到密钥协商的过程,而在另外一些普通场合则无需对报文加密.反 ...
- listview下拉刷新上拉加载扩展(二)-仿美团外卖
经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...
- 为学Android,我看了这些书
刚刚开始新的学习生活时,很容易走错方向,然后,这意味着不知道该学习什么,不知道该怎样学习,很显然,我写下这句话意味着我走过这样的路,为此,就付出了不小的代价,浪费了很多时间. 这篇文章当然 ...
- Linux驱动基础:MSM平台AP/CP通信机制
点击打开链接 概述 MSM平台AP和CP封装到一个芯片,共享内容.所以之前也说过,高通的MSM解决方案中,CP的代码都是由AP放到指定地址的内存中以供CP运行.那上传完代码,CP开始跑之后,AP/CP ...
- Android性能优化之常见的内存泄漏
前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...
- Bootstrap模板代码+页面自适应页面的案例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- outlook邮箱邮件与企业邮箱同步(outlook本地文件夹邮件,web邮箱里没有)
用惯了outlook2010, 问题:今天将邮件放到自定义文件夹后,发现在web邮箱中看不到邮件了.不能同步到企业邮箱. 解决忙了一天,才知道是账户类型问题,pop3类型,只下载不上传.所以outlo ...
- JSP编译成Servlet(五)JDT Compiler编译器
通过JSP编译器编译后生成了对应的java文件,接下去要把Java文件编译成class文件.对于这部分完全没有必要重新造轮子,常见的优秀编译工具有Eclipse JDT Java编译器和Ant编译器. ...