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服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...
随机推荐
- UNIX网络编程——客户/服务器程序设计示范(六)
TCP并发服务器程序,每个客户一个线程 前面讲述了,每个客户一个进程的服务器,或为每个客户现场fork一个子进程,或者预先派生一定数目的子进程.如果服务器主机支持线程,我们就可以改用线程以取代子进程. ...
- Oracle EBS R12文件系统结构(学习汇总网上资料)
Oracle EBS R12在服务器端文件结构如下: 顶层目录下面分为 1)inst --–跟ebs整个实例(instance)相关的配置信息以及其他信息 2) db ---主要存储DB层的信息 ...
- (六十九)使用block进行消息传递
在两个类之间进行消息传递,一般通过代理或者block进行,代理写起来较为麻烦,block较为简单,但是block需要特别注意内存泄漏问题,注意self和block之间要为弱引用,下面介绍使用block ...
- Eclipse中查看没有源码的Class文件的方法
本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...
- 《java入门第一季》模拟用户登陆注册案例集合版
需求:校验用户名和密码,登陆成功后玩猜数字小游戏. 在这里先写集合版.后面还有IO版.数据库版. 一.猜数字小游戏类: 猜数字小游戏的代码见博客:http://blog.csdn.net/qq_320 ...
- 04_Weblogic之受管服务器:配置受管服务器,启动受管服务器,解决因为强制关闭Weblogic之后导致启动有问题的问题,配置boot.properties
配置受管服务器, 先启动WebLogic服务器,启动方式如下: 在WebLogic控制台中的"开发模式"---"锁定并编辑"模式下,点击"Ser ...
- Mybatis插件原理分析(二)
在上一篇中Mybatis插件原理分析(一)中我们主要介绍了一下Mybatis插件相关的几个类的源码,并对源码进行了一些解释,接下来我们通过一个简单的插件实现来对Mybatis插件的运行流程进行分析. ...
- 【IOS 开发】Object - C 语法 之 类型转换
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3913507 ...
- 关于Eclipse创建Android项目时,会多出一个appcompat_v7的问题
问题描述: 使用eclipse创建一个Android项目时,发现project列表中会多创建出一个appcompat_v7项目,再创建一个Android项目时,又会再多出一个appcompat_ ...
- python import自己编写的模块:import json和simplejson
python import的模块都是库里面的,而自己的模块也可以添加 比如python的json处理,库里没有json文件,import json不行. 网上大部分人告诉你处理json用 dumps和 ...