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服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...
随机推荐
- 使用Geolocation校正GDAL不支持的数据
对于低分数据来说,常用的校正方式就是给定数据的经纬度查找表来进行校正.在GDAL中,这种校正方式叫Geolocation array.常用的数据有国外的MODIS数据,国内的如风云系列(FY)和海洋系 ...
- MyBatis与MySQL交互
MyBatis是我接触到的第一个框架,下面谈一谈我第一次使用MyBatis时的感悟. 首先是一些准备工作 下载相关的jar包.到GitHub上就行,上面有全面和完整的jar文件 在eclipse上安装 ...
- (一〇一)集成静态库RHAddressBook实现OC访问通讯录
使用官方的AddressBook框架仅能使用C语言访问通讯录,十分不便,这里介绍集成第三方框架RHAddressBook的方法,该框架可以通过OC访问和操作通讯录. 该框架是一个静态库,集成比较复杂. ...
- C++编写ATM
偶然看到的一段代码,代码虽然简单,但是挺有意思: #include <iostream> #include <conio.h> //全局变量 float sum_m ...
- Android的TabHost组件-android的学习之旅(四十)
TabHost简介 虽然,官方建议用Fagment取代TabHost,但是我们还是大概的介绍一下.TabHost是一种非常简单的组件,TabHost可以很方便的在窗口放置多个标签页,每一个标签页相当于 ...
- Android 优质精准的用户行为统计和日志打捞方案
Android 自定义优质精准的用户行为和日志打捞方案 Tamic csdn博客 :http://blog.csdn.net/sk719887916/article/details/51398416 ...
- [rrdtool]监控和自动画图,简单的监控.md
现在想要监控服务的流量和并发数,可是又没那么多时间来写系统,其他的运维系统又不熟悉,于是就用现有的rrdtool shell做了个简单的监控界面,临时用下,也算是个小实验把. rrdtool也是刚接触 ...
- 【一天一道LeetCode】#105. Construct Binary Tree from Preorder and Inorder Traversal
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...
- Google Guava的5个鲜为人知的特性
译文出处: 花名有孚 原文出处:takipi.com Google Guava有哪些比较冷门但却又实用的特性呢? 它是最流行的开源库之一,你应该听过它的大名,它诞生的地方正是人们举办真正的魁地奇比 ...
- JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用
JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...