分享一个 C# Winfrom 下的 OutlookBar 控件的使用
最近在上网的时候,发现了这个C# 下的 OutlookBar 控件,看了一下感觉还真不错,特此记录一下。

using System;
using System.Drawing;
using System.Windows.Forms; namespace OutLookBarDemo
{
internal class BandTagInfo
{
public OutlookBar outlookBar;
public int index; public BandTagInfo(OutlookBar ob, int index)
{
outlookBar=ob;
this.index=index;
}
} public class OutlookBar : Panel
{
private int buttonHeight;
private int selectedBand;
private int selectedBandHeight; public int ButtonHeight
{
get
{
return buttonHeight;
} set
{
buttonHeight=value;
// do recalc layout for entire bar
}
} public int SelectedBand
{
get
{
return selectedBand;
}
set
{
SelectBand(value);
}
} public OutlookBar()
{
buttonHeight=;
selectedBand=;
selectedBandHeight=;
} public void Initialize()
{
//parent Panel 必须存在不能删除
//this.BorderStyle = BorderStyle.None;
Parent.SizeChanged+=new EventHandler(SizeChangedEvent);
} public void AddBand(string caption, ContentPanel content)
{
content.outlookBar=this;
int index=Controls.Count;
BandTagInfo bti=new BandTagInfo(this, index);
BandPanel bandPanel=new BandPanel(caption, content, bti);
Controls.Add(bandPanel);
UpdateBarInfo();
RecalcLayout(bandPanel, index);
} public void SelectBand(int index)
{
selectedBand=index;
RedrawBands();
} private void RedrawBands()
{
for (int i=; i<Controls.Count; i++)
{
BandPanel bp=Controls[i] as BandPanel;
RecalcLayout(bp, i);
}
} private void UpdateBarInfo()
{
selectedBandHeight=ClientRectangle.Height-(Controls.Count * buttonHeight);
} private void RecalcLayout(BandPanel bandPanel, int index)
{
int vPos=(index <= selectedBand) ? buttonHeight*index : buttonHeight*index+selectedBandHeight;
int height=selectedBand==index ? selectedBandHeight+buttonHeight : buttonHeight; // the band dimensions
bandPanel.Location=new Point(, vPos);
bandPanel.Size=new Size(ClientRectangle.Width, height); // the contained button dimensions
bandPanel.Controls[].Location=new Point(, );
bandPanel.Controls[].Size=new Size(ClientRectangle.Width, buttonHeight); // the contained content panel dimensions
bandPanel.Controls[].Location=new Point(, buttonHeight);
bandPanel.Controls[].Size=new Size(ClientRectangle.Width-, height-);
} private void SizeChangedEvent(object sender, EventArgs e)
{
Size=new Size(Size.Width, ((Control)sender).ClientRectangle.Size.Height);
UpdateBarInfo();
RedrawBands();
}
} internal class BandPanel : Panel
{
public BandPanel(string caption, ContentPanel content, BandTagInfo bti)
{ BandButton bandButton=new BandButton(caption, bti);
Controls.Add(bandButton);
Controls.Add(content);
}
} internal class BandButton : Button
{
private BandTagInfo bti; public BandButton(string caption, BandTagInfo bti)
{
Text=caption;
FlatStyle=FlatStyle.Standard;
Visible=true;
this.bti=bti;
Click+=new EventHandler(SelectBand);
} private void SelectBand(object sender, EventArgs e)
{
bti.outlookBar.SelectBand(bti.index);
}
} public abstract class ContentPanel : Panel
{
public OutlookBar outlookBar; public ContentPanel()
{
// initial state
Visible=true;
}
} public class IconPanel : ContentPanel
{
protected int iconSpacing;
protected int margin; public int IconSpacing
{
get
{
return iconSpacing;
}
} public int Margin
{
get
{
return margin;
}
} public IconPanel()
{
margin=;
//这里是调节图标间距的
iconSpacing = + + ; // icon height + text height + margin
BackColor=Color.LightBlue;
AutoScroll=true;
} public void AddIcon(string caption, Image image, EventHandler onClickEvent)
{
int index=Controls.Count/; // two entries per icon
PanelIcon panelIcon=new PanelIcon(this, image, index, onClickEvent);
Controls.Add(panelIcon); Label label=new Label();
label.Text=caption;
label.Visible=true;
label.Location = new Point(, margin + image.Size.Height + index * iconSpacing+);
label.Size=new Size(Size.Width, );
label.TextAlign=ContentAlignment.BottomCenter;
label.Click+=onClickEvent;
label.Tag=panelIcon;
Controls.Add(label);
}
} public class PanelIcon : PictureBox
{
public int index;
public IconPanel iconPanel; private Color bckgColor;
private bool mouseEnter; public int Index
{
get
{
return index;
}
} public PanelIcon(IconPanel parent, Image image, int index, EventHandler onClickEvent)
{
this.index=index;
this.iconPanel=parent;
Image=image;
Visible=true;
Location=new Point(iconPanel.outlookBar.Size.Width/-image.Size.Width/,
iconPanel.Margin + index*iconPanel.IconSpacing);
Size=image.Size;
Click+=onClickEvent;
Tag=this; MouseEnter+=new EventHandler(OnMouseEnter);
MouseLeave+=new EventHandler(OnMouseLeave);
MouseMove+=new MouseEventHandler(OnMouseMove); bckgColor=iconPanel.BackColor;
mouseEnter=false;
} private void OnMouseMove(object sender, MouseEventArgs args)
{
if ( (args.X < Size.Width-) &&
(args.Y < Size.Width-) &&
(!mouseEnter) )
{
BackColor=Color.LightCyan;
BorderStyle=BorderStyle.FixedSingle;
Location=Location-new Size(, );
mouseEnter=true;
}
} private void OnMouseEnter(object sender, EventArgs e)
{
} private void OnMouseLeave(object sender, EventArgs e)
{
if (mouseEnter)
{
BackColor=bckgColor;
BorderStyle=BorderStyle.None;
Location=Location+new Size(, );
mouseEnter=false;
}
}
}
}
OutlookBar 组件代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace OutLookBarDemo
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent(); #region 初始化 OutLookBar
outlookBar.BorderStyle = BorderStyle.FixedSingle;
outlookBar.Initialize();
IconPanel iconPanel1 = new IconPanel();
IconPanel iconPanel2 = new IconPanel();
IconPanel iconPanel3 = new IconPanel(); outlookBar.AddBand("工具条A", iconPanel1);
outlookBar.AddBand("工具条B", iconPanel2);
outlookBar.AddBand("工具条C", iconPanel3); //
iconPanel1.AddIcon("信息查询", Image.FromFile(@"Image\1.ico"), new EventHandler(PanelEventA));
//
iconPanel1.AddIcon("购物车管理", Image.FromFile(@"Image\2.ico"), new EventHandler(PanelEventA));
//
iconPanel2.AddIcon("电子邮件", Image.FromFile(@"Image\3.ico"), new EventHandler(PanelEventB));
//
iconPanel2.AddIcon("密码管理", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventB));
//
iconPanel3.AddIcon("时间设置", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventC));
outlookBar.SelectBand();
#endregion
} public void PanelEventA(object sender, EventArgs e)
{
Control ctrl = (Control)sender;
PanelIcon panelIcon = ctrl.Tag as PanelIcon;
string clickInfo = string.Empty;
switch (panelIcon.Index)
{
case :
clickInfo = "信息查询";
break;
case :
clickInfo = "购物车管理";
break;
}
this.label1.Text = string.Format("您选择了 {0}", clickInfo);
} public void PanelEventB(object sender, EventArgs e)
{
Control ctrl = (Control)sender;
PanelIcon panelIcon = ctrl.Tag as PanelIcon;
string clickInfo = string.Empty; switch (panelIcon.Index)
{
case :
clickInfo = "电子邮件";
break;
case :
clickInfo = "密码管理";
break;
}
this.label1.Text = string.Format("您选择了 {0}", clickInfo);
} public void PanelEventC(object sender, EventArgs e)
{
Control ctrl = (Control)sender;
PanelIcon panelIcon = ctrl.Tag as PanelIcon;
string clickInfo = string.Empty;
switch (panelIcon.Index)
{
case :
clickInfo = "时间设置";
break;
}
this.label1.Text = string.Format("您选择了 {0}", clickInfo);
}
}
}
调用代码
虽然 调用和获取 这块有点费劲,但是还是不错的一款组件。
分享一个 C# Winfrom 下的 OutlookBar 控件的使用的更多相关文章
- 福利到~分享一个基于jquery的智能提示控件intellSeach.js
一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...
- 分享一个Winform里面的HTML编辑控件Zeta HTML Edit Control,汉化附源码
我们知道,Web开发上有很多HTML的编辑控件,如FCKEditor.CKEditor.kindeditor等等,很多都做的很好,而虽然Winform里面有WebBrowser控件,但是默认这个控件是 ...
- Android PullToRefresh下拉刷新控件的简单使用
PullToRefresh这个开源库早就听说了,不过一直没用过.作为一个经典的的开源库,我觉得还是有必要认识一下. 打开github上的网址:https://github.com/chrisbanes ...
- Android SwipeRefreshLayout 官方下拉刷新控件介绍
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...
- Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件
前言: 忙完了结婚乐APP的开发,终于可以花一定的时间放在博客上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下目标效果以及demo效果: 因为此效果实现的步骤 ...
- android官方下拉刷新控件SwipeRefreshLayout的使用
可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介:SwipeRefreshLayout组件只 ...
- 9.2.2 .net framework下的MVC 控件的封装(下)
控件封装的部分说明 可能有人觉得应该前后端分离,我也承认这是应该的方向,我们也在考虑使用ng2等简化前端.但是,我们封装控件还是因为如下原因综合考虑的: 我们这是个框架,上面支撑了许多个应用,包含几百 ...
- 9.2.1 .net framework下的MVC 控件的封装(上)
在写.net core下mvc控件的编写之前,我先说一下.net framework下我们MVC控件的做法. MVC下控件的写法,主要有如下三种,最后一种是泛型的写法,mvc提供的控件都是基本控件. ...
- [Android]下拉刷新控件RefreshableView的实现
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4172483.html 需求:自定义一个ViewGroup,实现 ...
随机推荐
- 深入浅出C#中的静态与非静态
C#语言静态类 vs 普通类 C#语言静态类与普通类的区别有以下几点: 1)C#语言静态类无法实例化而普通类可以: 2)C#语言静态类只能从System.Object基类继承:普通可以继承其它任何非 ...
- 【C-数组】
一.一维数组 ①.定义方式 类型说明符 数组名 [常量表达式]; 如:int array[10]; 注意: 1) 数组的类型实际上是指数组元素的类型.对于同一个数组,其所有元素的数据类型都是相同的. ...
- sshd 错误
140669086946976:error:0E079065:configuration file routines:DEF_LOAD_BIO:missing equal sign:conf_def. ...
- 【转】js写显示农历的日期
网上查找了个,记录下. <body> <!-- 中国农历开始 --> <SCRIPT language=JavaScript> <!-- var lunarI ...
- Linux + Mono 目前已经支持Entity Framework 6.1
在上个随笔 CentOS上 Mono3.2.8运行ASP.NET MVC4经验中,步骤2中要求卸载EF 5.0,这样才能在Linux + Mono的环境中运行ASP.NET MVC4的Web应用.今天 ...
- 高性能网站架构设计之缓存篇(1)- Redis的安装与使用
一.什么 Redis REmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包 ...
- 如何快速把hdfs数据动态导入到hive表
1. hdfs 文件 {"retCode":1,"retMsg":"Success","data":[{" ...
- centos 6.5 X64 安装 mongodb 2.6.1 (笔记 实测)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5-x86_64 *** Centos编译安装mongodb 2.6 系统最好是64位的,才 ...
- ENode 1.0 - 整体架构介绍
前言 今天是个开心的日子,又是周末,可以安心轻松的写写文章了.经过了大概3年的DDD理论积累,以及去年年初的第一个版本的event sourcing框架的开发以及项目实践经验,再通过今年上半年利用业余 ...
- MySQL5:性能优化
性能优化 优化MySQL数据库是数据库管理员和数据库开发人员的必备技能.MySQL优化,一方面是找出系统的瓶颈,提高MySQL数据库的整体性能:一方面需要合理的结构设计和参数调整,以提高用户操作响应的 ...