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服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...
随机推荐
- 剑指Offer——全排列递归思路
剑指Offer--全排列递归思路 前言 全排列,full permutation, 可以利用二叉树的遍历实现.二叉树的递归遍历,前中后都简洁的难以置信,但是都有一个共同特点,那就是一个函数里包含两次自 ...
- 当图片验证码遇上JSP
今天看到了一个关于使用JSP方式生成图片验证码 的小例子,感觉真的是很不错,拿来分享一下. 原理 对于图片验证码,我们在审查元素的时候会方便的看出是<img src="#" ...
- (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...
- UNIX网络编程——套接字选项(SOL_SOCKET级别)
#include <sys/socket.h> int setsockopt( int socket, int level, int option_name,const void *opt ...
- Eclipse中查看没有源码的Class文件的方法
本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...
- Dynamics CRM2013 ScLib::AccessCheckEx failed
今天在系统中做某一操作的时候报如下截图错误,把错误日志下载下来,根据AccessRights这:ReadAccess一提示确定是对某一实体没有读的权限. 那怎样知道是哪个实体呢,再看上面错误日志中给出 ...
- ORACLE数据库 DBA常用知识
<常用命令参考> 个系统变量值 SQL> show user --显示当前连接用户 SQL> show error --显示错误 SQL> set heading off ...
- Cocos2D:塔防游戏制作之旅(十七)
getHpDamage方法当敌人到达基地时被调用.你需要添加该方法到Enemy.m的update:方法中去,以便检查当敌人到达基地是会发生什么.幸运的是,你已经在之前的代码中实现这些了,你可以接着往下 ...
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十八)
在游戏中制作手臂瞄准线,也就是所谓的辅助延长线.玩台球游戏的童鞋应该可以了解. 按道理来说,延长线是一个物理实体,遇到物理刚体应该会发生反弹行为,这个符合实际游戏逻辑. 但是这里为了简单,只是做一条& ...
- MiseringThread.java 解析页面线程
MiseringThread.java 解析页面线程 http://injavawetrust.iteye.com package com.iteye.injavawetrust.miner; imp ...