• 分享一个 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=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(@"Image1.ico"), new EventHandler(PanelEventA));
                //1
                iconPanel1.AddIcon("购物车管理", Image.FromFile(@"Image2.ico"), new EventHandler(PanelEventA));
                //2
                iconPanel2.AddIcon("电子邮件", Image.FromFile(@"Image3.ico"), new EventHandler(PanelEventB));
                //3
                iconPanel2.AddIcon("密码管理", Image.FromFile(@"Image4.ico"), new EventHandler(PanelEventB));
                //4
                iconPanel3.AddIcon("时间设置", Image.FromFile(@"Image4.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);
            }
        }
    }
    调用代码

     虽然 调用和获取 这块有点费劲,但是还是不错的一款组件。

    -==源码下载==-

  • 相关阅读:
    linux-kernel邮件列表订阅出错,提示命令不能识别---解决方案
    MD5(单向散列算法)原理分析
    win32汇编跳转指令用法
    (转载)c/c++优先级列表
    linux man手册各个章节的意义
    如何解决dpkg: error processing install-info
    python魔法函数(常见)
    redis 哈希封装
    数据库去重
    抖音破解字体加密
  • 原文地址:https://www.cnblogs.com/lxblog/p/3179296.html
Copyright © 2020-2023  润新知