最近在上网的时候,发现了这个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);
}
}
}
调用代码
虽然 调用和获取 这块有点费劲,但是还是不错的一款组件。