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服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...
随机推荐
- 4.2、Android Studio压缩你的代码和资源
为了让你的APK文件尽可能的小,你需要在构建的时候开启压缩来移除无用的代码和资源. 代码压缩可在ProGuard中使用,可以检测和清除无用的类,变量,方法和属性,甚至包括你引用的库.ProGuard同 ...
- Shell 整数比较、字符串比较
整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" - ...
- Java并发框架——公平性
所谓公平性指所有线程对临界资源申请访问权限的成功率都一样,不会让某些线程拥有优先权.通过前面的CLH Node FIFO学习知道了等待队列是一个先进先出的队列,那么是否就可以说每条线程获取锁时就是公平 ...
- Hibernate超简单多表操作
所谓一对多映射 在数据库中我们通常会通过添加外键的方式将表关联起来,表现一对多的关系. 而在Hibernate中,我们则要通过在一方持有多方的集合来实现,即在"一"的一端中使用元素 ...
- UNIX环境高级编程——信号基本概述和signal函数
一.为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程.2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断.3. 如果CPU当前正在执行这个进程的代码,则 ...
- iOS APP设计规范大全
目前最为齐全的iOS APP设计规范大全,Mark一个- 欢迎参考本文,未经许可,严禁转载!
- SpriteBuilder中CCMotionStreak提示图片文件找不到
今天写代码时遇到上述问题,代码如下: player.streak = [CCMotionStreak streakWithFade:3.f minSeg:1 width:30 color:[CCCol ...
- Leetcode_172_Factorial Trailing Zeroes
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42417535 Given an integer n, re ...
- android 开源图表库MPChart最简单使用方法示例教程Demo--折线图 柱状图
转载请注明本文出处:http://blog.csdn.net/wingichoy/article/details/50428246 MPChart是android上一款强大的图表开源库,他可以轻松的绘 ...
- Leetcode_162_Find Peak Element
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43415313 A peak element is an e ...