1. 程式人生 > >分享一個 C# Winfrom 下的 OutlookBar 控件的使用

分享一個 C# Winfrom 下的 OutlookBar 控件的使用

mat hang tag public itl hand 一個 wid ted

最近在上網的時候,發現了這個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 dimensions bandPanel.Location=new Point(0, vPos); bandPanel.Size=new Size(ClientRectangle.Width, height); // the contained button dimensions bandPanel.Controls[0].Location=new Point(0, 0); bandPanel.Controls[0].Size=new Size(ClientRectangle.Width, buttonHeight); // the contained content panel dimensions bandPanel.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 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=20; //這裏是調節圖標間距的 iconSpacing = 32 + 15 + 20; // icon height + text height + margin BackColor=Color.LightBlue; AutoScroll=true; } public void AddIcon(string caption, Image image, EventHandler onClickEvent) { int index=Controls.Count/2; // 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(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 初始化 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);

            //0
            iconPanel1.AddIcon("信息查詢", Image.FromFile(@"Image\1.ico"), new EventHandler(PanelEventA));
            //1
            iconPanel1.AddIcon("購物車管理", Image.FromFile(@"Image\2.ico"), new EventHandler(PanelEventA));
            //2
            iconPanel2.AddIcon("電子郵件", Image.FromFile(@"Image\3.ico"), new EventHandler(PanelEventB));
            //3
            iconPanel2.AddIcon("密碼管理", Image.FromFile(@"Image\4.ico"), new EventHandler(PanelEventB));
            //4
            iconPanel3.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# Winfrom 下的 OutlookBar 控件的使用