c# 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=25;selectedBand=0;selectedBandHeight=0;}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=0; 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 dimensionsbandPanel.Location=new Point(0, vPos);bandPanel.Size=new Size(ClientRectangle.Width, height);// the contained button dimensionsbandPanel.Controls[0].Location=new Point(0, 0);bandPanel.Controls[0].Size=new Size(ClientRectangle.Width, buttonHeight);// the contained content panel dimensionsbandPanel.Controls[1].Location=new Point(0, buttonHeight);bandPanel.Controls[1].Size=new Size(ClientRectangle.Width-2, height-8);}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 stateVisible=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=20;//这里是调节图标间距的iconSpacing = 32 + 15 + 20; // icon height + text height + marginBackColor=Color.LightBlue;AutoScroll=true;}public void AddIcon(string caption, Image image, EventHandler onClickEvent){int index=Controls.Count/2; // two entries per iconPanelIcon panelIcon=new PanelIcon(this, image, index, onClickEvent);Controls.Add(panelIcon);Label label=new Label();label.Text=caption;label.Visible=true;label.Location = new Point(0, margin + image.Size.Height + index * iconSpacing+5);label.Size=new Size(Size.Width, 15);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/2-image.Size.Width/2,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-2) &&(args.Y < Size.Width-2) &&(!mouseEnter) ){BackColor=Color.LightCyan;BorderStyle=BorderStyle.FixedSingle;Location=Location-new Size(1, 1);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(1, 1);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 初始化 OutLookBaroutlookBar.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);//0iconPanel1.AddIcon("信息查询", Image.FromFile(@"Image\1.ico"), new EventHandler(PanelEventA));//1iconPanel1.AddIcon("购物车管理", Image.FromFile(@"Image\2.ico"), new EventHandler(PanelEventA));//2iconPanel2.AddIcon("电子邮件", Image.FromFile(@"Image\3.ico"), new EventHandler(PanelEventB));//3iconPanel2.AddIcon("密码管理", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventB));//4iconPanel3.AddIcon("时间设置", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventC));outlookBar.SelectBand(0);#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 0:clickInfo = "信息查询";break;case 1: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 0:clickInfo = "电子邮件";break;case 1: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 0:clickInfo = "时间设置";break;}this.label1.Text = string.Format("您选择了 {0}", clickInfo);}} }调用代码
虽然 调用和获取 这块有点费劲,但是还是不错的一款组件。
-==源码下载==-
c# OutlookBar控件相关推荐
- 分享一个 C# Winfrom 下的 OutlookBar 控件的使用
最近在上网的时候,发现了这个C# 下的 OutlookBar 控件,看了一下感觉还真不错,特此记录一下. using System; using System.Drawing; using Syste ...
- 一个效果很好的outlookbar控件CXTOutBarCtrl
该控件来源于Xtreme Toolkit,我对其进行了修改,使其不依赖于类库独立存在,由于我没有运用XT的其他类,可能你会觉得它没有在类库中的华丽,但相对于其小巧的体格而言,已经很难得了. 源文件包括 ...
- (转)WinForm控件使用文章收藏整理完成
http://home.cnblogs.com/group/topic/29829.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. ...
- C# WinForm控件、自定义控件整理(大全)
C# WinForm开发系列 - CheckBox/Button/Label/ProgressBar WinForm下CheckedListBox的数据绑定 Winform 下无闪烁走马灯效果实现 c ...
- .Net(C#)自定义WinForm控件之小结篇(强力推荐)
强力推荐的网站:http://www.myfirm.cn/News/dotNetGUIAPI/ 本文转载:http://www.myfirm.cn/News/dotNetUserInterface/2 ...
- WinForm控件使用文章收藏整理完成
对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Lab ...
- Qt---布局,设置控件边距,拉伸因子
QGridLayout *LeftLayout =new QGridLayout(this); LeftLayout->addWidget(label1, 0, 0); //label1在第1行 ...
- HarmonyOS 字体在自身控件中居中(使用text_alignment)
要实现的效果就是把字体在控件居中 HarmonyOS 使用的是text_alignment 属性,详细的如下 text_alignment 文本对齐方式 left 表示文本靠左对齐. 可以设置取值项 ...
- Android 如何防止用户同时点击多个控件问题
qa 测试说 一次连点不同的控件,app 多个控件分别有响应 这个问题处理方法也是很简单 就是在布局里面添加 android:splitMotionEvents="false"a ...
最新文章
- html点击按钮弹出窗口_电脑桌面总是弹出广告怎么办?教你2种方法,轻松解决...
- Linux 下编译并运行C++程序
- 有的时候入门只是一瞬间
- python继承多重继承
- mysql函数使用场景_mysql的函数和存储过程的比较,以及在实际场景中的使用案例...
- PHP实现折半查询算法
- docker java 中文乱码_记一次ubuntu docker 镜像 java 中文乱码问题查找
- python简明教程_05
- 21天学通java web 第二版pdf_21天学通JAVA WEB开发 pdf完全版_IT教程网
- 仓储物流机器人:快仓、海柔创新“极速前进”
- 盘点关于程序员的那些经典案例
- 如何用Photoshop去制作一张质量高的banner(轮播图)?
- Ubuntu 无法连接网络
- (近5w字)面向小白のVue全家桶开发电商管理系统项目总结文档
- Python - 面向对象编程
- 通信教程 | 常见串行通信基础原理
- 文件服务器网盘,文件服务器 网盘 云
- sqlserver 中 @@rowcount的简单用法
- shell 脚本中求一个字符串的长度
- 第一讲:个人建站云服务器选择
热门文章
- 又涨了!2021 年 5 月程序员工资统计新鲜出炉,网友:还是Java程序员牛逼~
- python中的os.listdir()方法、os.path.isdir()方法
- 普通socket服务端
- java super.clone解释_super.clone()做了什么
- 工作10年写不好一封邮件?
- java map详解
- Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have
- 2017年7月工作总结
- 计算机应用 期刊 多久给消息,计算机应用 审稿流程 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
- 云服务器和真实服务器,个人网站主机选择原则 看配置也要看是不是有助于优化...