最近在上网的时候,发现了这个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控件相关推荐

  1. 分享一个 C# Winfrom 下的 OutlookBar 控件的使用

    最近在上网的时候,发现了这个C# 下的 OutlookBar 控件,看了一下感觉还真不错,特此记录一下. using System; using System.Drawing; using Syste ...

  2. 一个效果很好的outlookbar控件CXTOutBarCtrl

    该控件来源于Xtreme Toolkit,我对其进行了修改,使其不依赖于类库独立存在,由于我没有运用XT的其他类,可能你会觉得它没有在类库中的华丽,但相对于其小巧的体格而言,已经很难得了. 源文件包括 ...

  3. (转)WinForm控件使用文章收藏整理完成

    http://home.cnblogs.com/group/topic/29829.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. ...

  4. C# WinForm控件、自定义控件整理(大全)

    C# WinForm开发系列 - CheckBox/Button/Label/ProgressBar WinForm下CheckedListBox的数据绑定 Winform 下无闪烁走马灯效果实现 c ...

  5. .Net(C#)自定义WinForm控件之小结篇(强力推荐)

    强力推荐的网站:http://www.myfirm.cn/News/dotNetGUIAPI/ 本文转载:http://www.myfirm.cn/News/dotNetUserInterface/2 ...

  6. WinForm控件使用文章收藏整理完成

    对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Lab ...

  7. Qt---布局,设置控件边距,拉伸因子

    QGridLayout *LeftLayout =new QGridLayout(this); LeftLayout->addWidget(label1, 0, 0); //label1在第1行 ...

  8. HarmonyOS 字体在自身控件中居中(使用text_alignment)

    要实现的效果就是把字体在控件居中 HarmonyOS  使用的是text_alignment 属性,详细的如下 text_alignment 文本对齐方式 left 表示文本靠左对齐. 可以设置取值项 ...

  9. Android 如何防止用户同时点击多个控件问题

    qa 测试说 一次连点不同的控件,app 多个控件分别有响应  这个问题处理方法也是很简单 就是在布局里面添加 android:splitMotionEvents="false"a ...

最新文章

  1. html点击按钮弹出窗口_电脑桌面总是弹出广告怎么办?教你2种方法,轻松解决...
  2. Linux 下编译并运行C++程序
  3. 有的时候入门只是一瞬间
  4. python继承多重继承
  5. mysql函数使用场景_mysql的函数和存储过程的比较,以及在实际场景中的使用案例...
  6. PHP实现折半查询算法
  7. docker java 中文乱码_记一次ubuntu docker 镜像 java 中文乱码问题查找
  8. python简明教程_05
  9. 21天学通java web 第二版pdf_21天学通JAVA WEB开发 pdf完全版_IT教程网
  10. 仓储物流机器人:快仓、海柔创新“极速前进”
  11. 盘点关于程序员的那些经典案例
  12. 如何用Photoshop去制作一张质量高的banner(轮播图)?
  13. Ubuntu 无法连接网络
  14. (近5w字)面向小白のVue全家桶开发电商管理系统项目总结文档
  15. Python - 面向对象编程
  16. 通信教程 | 常见串行通信基础原理
  17. 文件服务器网盘,文件服务器 网盘 云
  18. sqlserver 中 @@rowcount的简单用法
  19. shell 脚本中求一个字符串的长度
  20. 第一讲:个人建站云服务器选择

热门文章

  1. 又涨了!2021 年 5 月程序员工资统计新鲜出炉,网友:还是Java程序员牛逼~
  2. python中的os.listdir()方法、os.path.isdir()方法
  3. 普通socket服务端
  4. java super.clone解释_super.clone()做了什么
  5. 工作10年写不好一封邮件?
  6. java map详解
  7. Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have
  8. 2017年7月工作总结
  9. 计算机应用 期刊 多久给消息,计算机应用 审稿流程 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  10. 云服务器和真实服务器,个人网站主机选择原则 看配置也要看是不是有助于优化...