分享一个 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,实现 ...
随机推荐
- Python学习之路--面向对象
1.面向对象概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向 ...
- C++内存对齐的理解
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式. 编译器中提供了#pragma pack(n)来设 ...
- 如何去掉底部的织梦版权信息powered by dedecms
由于织梦DEDECMS程序6月份的漏洞,很多织梦网站都被黑了,所以大家都在抓紧时间更新系统补丁.但是这次的DEDECMS V5.7版本更新后,在前台网页底部会出现织梦版权信息 “powered by ...
- 深入剖析Nginx一点小笔记
前几天在图书馆看书,恰好看到这本<深入剖析nginx>,花了快一周的时间看完了这本书,写点笔记心得便于以后复习. 以前对nginx的认识就只是停留在一个反向代理服务器上.百度了一下ngin ...
- Restful.Data 开源持久层组件项目最新进展和使用说明
Restful.Data 经过 博客园 和 CSDN 的宣传,目前参与该项目的人数已达到 114 人(群号:338570336),虽大部分并不参与实际开发,但他们所提出的意见和建议以及在试用过程中发现 ...
- EntityFunctions.AsNonUnicode
http://blog.csdn.net/zzx3q/article/details/7863797 使用工具VS2010 凡是调用FindAll的地方,如果传入参数是String类型的变量(数字类型 ...
- Java学习:Annotation注解
Annotation不算常用的技术,早前用它写了一些玩意儿,过了一年又忘干净了,今天写点东西记下来,以备再忘之需. java.lang.annotation,接口 Annotation.对于Annot ...
- JavaScript中需要注意的几个问题
JavaScript是一门弱语言,她使用起来不像C/C++那样有十分繁琐的内存管理.类型定义等,所以学习JavaScript的门槛相对来说也比较低.门槛低并不意味着这门语言很简单,我们在使用的时候会遇 ...
- Node.js刷新session过期时间
在Node.js中,我们通常使用express-session这个包来使用和管理session,保存服务端和客户端浏览器之间的会话状态.那如何才能实现当用户刷新当前页面或者点击页面上的按钮时重新刷新s ...
- nanoTime对volatile 测试的一种写法
今天脑筋有点搭牢,想了半天才看出为什么以下两段代码效果是相同的... 第一种好处是可以直接批量复制黏贴system.out, 不用改什么东西 private static long i; priv ...