向导导航栏控件----------WinForm控件开发系列

Posted tlmbem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向导导航栏控件----------WinForm控件开发系列相关的知识,希望对你有一定的参考价值。

技术图片

  /// <summary>
  /// 导航导航栏控件
  /// </summary>
  [ToolboxItem(true)]
  [DefaultProperty("Items")]
  [DefaultEvent("NavigationItemClick")]
  [Description("导航导航栏控件")]
  public partial class NavigationBarExt : Control
  
    public delegate void EventHandler(object sender, NavigationItemEventArgs e);

    private event EventHandler navigationItemClick;
    /// <summary>
    /// 导航选项单击事件
    /// </summary>
    [Description("导航选项单击事件")]
    public event EventHandler NavigationItemClick
    
      add  this.navigationItemClick += value; 
      remove  this.navigationItemClick -= value; 
    

    #region

    private bool borderShow = false;
    /// <summary>
    ///是否显示边框
    /// </summary>
    [DefaultValue(false)]
    [Description("是否显示边框")]
    public bool BorderShow
    
      get  return this.borderShow; 
      set
      
        if (this.borderShow == value)
          return;
        this.borderShow = value;
        this.InitializeItemsSize();
        this.Invalidate();
      
    

    private ButtonBorderStyle borderStyle = ButtonBorderStyle.Solid;
    /// <summary>
    ///边框样式
    /// </summary>
    [DefaultValue(ButtonBorderStyle.Solid)]
    [Description("边框样式")]
    public ButtonBorderStyle BorderStyle
    
      get  return this.borderStyle; 
      set
      
        if (this.borderStyle == value)
          return;
        this.borderStyle = value;
        this.InitializeItemsSize();
        this.Invalidate();
      
    

    private int borderWidth = 0;
    /// <summary>
    ///边框宽度
    /// </summary>
    [DefaultValue(0)]
    [Description("边框宽度")]
    public int BorderWidth
    
      get  return this.borderWidth; 
      set
      
        if (this.borderWidth == value)
          return;
        this.borderWidth = value;
        this.InitializeItemsSize();
        this.Invalidate();
      
    

    private int itemMinWidth = 0;
    /// <summary>
    ///选项最小宽度
    /// </summary>
    [DefaultValue(0)]
    [Description("选项最小宽度")]
    public int ItemMinWidth
    
      get  return this.itemMinWidth; 
      set
      
        if (this.itemMinWidth == value || value < 0)
          return;
        this.itemMinWidth = value;
        this.InitializeItemsSize();
        this.Invalidate();
      
    

    private int itemMaxWidth = 0;
    /// <summary>
    ///选项最大宽度
    /// </summary>
    [DefaultValue(0)]
    [Description("选项最大宽度")]
    public int ItemMaxWidth
    
      get  return this.itemMaxWidth; 
      set
      
        if (this.itemMaxWidth == value || value < this.ItemMinWidth)
          return;
        this.itemMaxWidth = value;
        this.InitializeItemsSize();
        this.Invalidate();
      
    

    private Color borderColor = Color.Gray;
    /// <summary>
    /// 边框颜色
    /// </summary>
    [DefaultValue(typeof(Color), "Gray")]
    [Description("边框颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color BorderColor
    
      get  return this.borderColor; 
      set
      
        if (this.borderColor == value)
          return;
        this.borderColor = value;
        this.Invalidate();
      
    

    private Font textFont = new Font("宋体", 11);
    /// <summary>
    /// 文本字体
    /// </summary>
    [DefaultValue(typeof(Font), "宋体, 11pt")]
    [Description("文本字体")]
    public Font TextFont
    
      get  return this.textFont; 
      set
      
        if (this.textFont == value)
          return;
        this.textFont = value;
        this.Invalidate();
      
    

    private Color arrowsColor = Color.Gray;
    /// <summary>
    /// 箭头颜色
    /// </summary>
    [DefaultValue(typeof(Color), "Gray")]
    [Description("箭头颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color ArrowsColor
    
      get  return this.arrowsColor; 
      set
      
        if (this.arrowsColor == value)
          return;
        this.arrowsColor = value;
        this.Invalidate();
      
    

    private Color textColor = Color.White;
    /// <summary>
    /// 文本颜色
    /// </summary>
    [DefaultValue(typeof(Color), "White")]
    [Description("文本颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color TextColor
    
      get  return this.textColor; 
      set
      
        if (this.textColor == value)
          return;
        this.textColor = value;
        this.Invalidate();
      
    

    private Color textBackColor = Color.LightCoral;
    /// <summary>
    /// 文本背景颜色
    /// </summary>
    [DefaultValue(typeof(Color), "LightCoral")]
    [Description("文本背景颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color TextBackColor
    
      get  return this.textBackColor; 
      set
      
        if (this.textBackColor == value)
          return;
        this.textBackColor = value;
        this.Invalidate();
      
    

    private Color textEnterColor = Color.White;
    /// <summary>
    /// 鼠标进入文本颜色
    /// </summary>
    [DefaultValue(typeof(Color), "White")]
    [Description("鼠标进入文本颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color TextEnterColor
    
      get  return this.textEnterColor; 
      set
      
        if (this.textEnterColor == value)
          return;
        this.textEnterColor = value;
        this.Invalidate();
      
    

    private Color textEnterBackColor = Color.IndianRed;
    /// <summary>
    /// 鼠标进入文本背景颜色
    /// </summary>
    [DefaultValue(typeof(Color), "IndianRed")]
    [Description("鼠标进入文本背景颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color TextEnterBackColor
    
      get  return this.textEnterBackColor; 
      set
      
        if (this.textEnterBackColor == value)
          return;
        this.textEnterBackColor = value;
        this.Invalidate();
      
    

    private Color textSelectedColor = Color.White;
    /// <summary>
    /// 文本选中颜色
    /// </summary>
    [DefaultValue(typeof(Color), "White")]
    [Description("文本选中颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color TextSelectedColor
    
      get  return this.textSelectedColor; 
      set
      
        if (this.textSelectedColor == value)
          return;
        this.textSelectedColor = value;
        this.Invalidate();
      
    

    private Color textSelectedBackColor = Color.MediumSlateBlue;
    /// <summary>
    /// 文本选中背景颜色
    /// </summary>
    [DefaultValue(typeof(Color), "MediumSlateBlue")]
    [Description("文本选中背景颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color TextSelectedBackColor
    
      get  return this.textSelectedBackColor; 
      set
      
        if (this.textSelectedBackColor == value)
          return;
        this.textSelectedBackColor = value;
        this.Invalidate();
      
    

    private StyleType style = StyleType.Normal;
    /// <summary>
    /// 导航样式
    /// </summary>
    [DefaultValue(StyleType.Normal)]
    [Description("导航样式")]
    public StyleType Style
    
      get  return this.style; 
      set
      
        if (this.style == value)
          return;
        this.style = value;
        this.InitializeItemsSize();
        this.Invalidate();
      
    

    private NavigationItemCollection items;

    /// <summary>
    /// 导航选项集合
    /// </summary>
    [DefaultValue(null)]
    [Description("导航选项集合")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public NavigationItemCollection Items
    
      get
      
        if (this.items == null)
          this.items = new NavigationItemCollection(this);
        return this.items;
      
    

    protected override Size DefaultSize
    
      get
      
        return new Size(300, 23);
      
    

    #endregion

    public NavigationBarExt()
    
      SetStyle(ControlStyles.UserPaint, true);
      SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
      SetStyle(ControlStyles.ResizeRedraw, true);
      SetStyle(ControlStyles.SupportsTransparentBackColor, true);

      InitializeComponent();

    

    protected override void OnPaint(PaintEventArgs e)
    
      base.OnPaint(e);

      Graphics g = e.Graphics;
      g.SmoothingMode = SmoothingMode.AntiAlias;
      g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
      Rectangle rect = e.ClipRectangle;

      if (this.BorderShow)
      
        ControlPaint.DrawBorder(g, rect, this.BorderColor, this.BorderWidth, this.BorderStyle, this.BorderColor, this.BorderWidth, this.BorderStyle, this.BorderColor, this.BorderWidth, this.BorderStyle, this.BorderColor, this.BorderWidth, this.BorderStyle);
      

      for (int i = 0; i < this.Items.Count; i++)
      
        Color color = this.Items[i].TextColor == Color.Empty ? this.TextColor : this.Items[i].TextColor;
        Color backcolor = this.Items[i].TextBackColor == Color.Empty ? this.TextBackColor : this.Items[i].TextBackColor;
        if (this.Items[i].MoveStatus == ItemType.Enter)
        
          color = this.Items[i].TextEnterColor == Color.Empty ? this.TextEnterColor : this.Items[i].TextEnterColor;
          backcolor = this.Items[i].TextEnterBackColor == Color.Empty ? this.TextEnterBackColor : this.Items[i].TextEnterBackColor;
        
        else if (this.Items[i].Selected)
        
          color = this.Items[i].TextSelectedColor == Color.Empty ? this.TextSelectedColor : this.Items[i].TextSelectedColor;
          backcolor = this.Items[i].TextSelectedBackColor == Color.Empty ? this.TextSelectedBackColor : this.Items[i].TextSelectedBackColor;
        

        SolidBrush back_sb = new SolidBrush(backcolor);
        if (this.Style == StyleType.Normal)
        
          g.FillRectangle(back_sb, this.Items[i].TextRectF);

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)this.Items[i].TextRectF.X, (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
          if (i < this.Items.Count - 1)
          
            float w = this.Items[i].ArrowsRectF.Width - 4;
            Pen arrows_pen = new Pen(this.ArrowsColor, 2);
            g.DrawLine(arrows_pen, this.Items[i].ArrowsRectF.X, this.Items[i].ArrowsRectF.Y, this.Items[i].ArrowsRectF.X + w / 6 * 5, this.Items[i].ArrowsRectF.Y + this.Items[i].ArrowsRectF.Height / 2);
            g.DrawLine(arrows_pen, this.Items[i].ArrowsRectF.X + w / 6 * 5, this.Items[i].ArrowsRectF.Y + this.Items[i].ArrowsRectF.Height / 2, this.Items[i].ArrowsRectF.X, this.Items[i].ArrowsRectF.Y + this.Items[i].ArrowsRectF.Height);

            g.DrawLine(arrows_pen, this.Items[i].ArrowsRectF.X + w / 6 + 4, this.Items[i].ArrowsRectF.Y, this.Items[i].ArrowsRectF.X + w + 4, this.Items[i].ArrowsRectF.Y + this.Items[i].ArrowsRectF.Height / 2);
            g.DrawLine(arrows_pen, this.Items[i].ArrowsRectF.X + w + 4, this.Items[i].ArrowsRectF.Y + this.Items[i].ArrowsRectF.Height / 2, this.Items[i].ArrowsRectF.X + w / 6 + 4, this.Items[i].ArrowsRectF.Y + this.Items[i].ArrowsRectF.Height);
            arrows_pen.Dispose();
          
        
        else if (this.Style == StyleType.Parallelogram)
        
          GraphicsPath back_gp = new GraphicsPath();
          back_gp.AddPolygon(new PointF[] 
 new PointF(this.Items[i].TextRectF.X, this.Items[i].TextRectF.Y),
 new PointF(this.Items[i].TextRectF.Right - this.Items[i].TextRectF.Height / 2, this.Items[i].TextRectF.Y),
 new PointF(this.Items[i].TextRectF.Right , this.Items[i].TextRectF.Bottom),
 new PointF(this.Items[i].TextRectF.X + this.Items[i].TextRectF.Height / 2, this.Items[i].TextRectF.Bottom));
          g.FillPath(back_sb, back_gp);
          back_gp.Dispose();

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)(this.Items[i].TextRectF.X + this.Items[i].TextRectF.Height / 2), (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
        
        else if (this.Style == StyleType.Arrows)
        
          GraphicsPath back_gp = new GraphicsPath();
          back_gp.AddPolygon(new PointF[] 
 new PointF(this.Items[i].TextRectF.X, this.Items[i].TextRectF.Y),
 new PointF(this.Items[i].TextRectF.Right- this.Items[i].TextRectF.Height / 2, this.Items[i].TextRectF.Y),
 new PointF(this.Items[i].TextRectF.Right, this.Items[i].TextRectF.Y+this.Items[i].TextRectF.Height / 2),
 new PointF(this.Items[i].TextRectF.Right- this.Items[i].TextRectF.Height / 2, this.Items[i].TextRectF.Bottom),
 new PointF(this.Items[i].TextRectF.X , this.Items[i].TextRectF.Bottom),
 new PointF(this.Items[i].TextRectF.X+this.Items[i].TextRectF.Height / 2 , this.Items[i].TextRectF.Y+this.Items[i].TextRectF.Height / 2));
          g.FillPath(back_sb, back_gp);
          back_gp.Dispose();

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)(this.Items[i].TextRectF.X + this.Items[i].TextRectF.Height / 2), (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
        
        else if (this.Style == StyleType.RoundCap)
        
          GraphicsPath back_gp = new GraphicsPath();
          back_gp.AddArc(new RectangleF(this.Items[i].TextRectF.X - this.Items[i].TextRectF.Height / 2, this.Items[i].TextRectF.Y, this.Items[i].TextRectF.Height, this.Items[i].TextRectF.Height), 270, 180);
          back_gp.Reverse();
          back_gp.AddArc(new RectangleF(this.Items[i].TextRectF.Right - this.Items[i].TextRectF.Height, this.Items[i].TextRectF.Y, this.Items[i].TextRectF.Height, this.Items[i].TextRectF.Height), 270, 180);

          g.FillPath(back_sb, back_gp);
          back_gp.Dispose();

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)(this.Items[i].TextRectF.X + this.Items[i].TextRectF.Height / 2), (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
        
        else if (this.Style == StyleType.Quadrangle)
        
          g.FillRectangle(back_sb, this.Items[i].TextRectF);

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)this.Items[i].TextRectF.X, (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
        
        else if (this.Style == StyleType.Circular)
        
          GraphicsPath back_gp = new GraphicsPath();
          back_gp.AddArc(new RectangleF(this.Items[i].TextRectF.Right - this.Items[i].TextRectF.Height * 2, this.Items[i].TextRectF.Y, this.Items[i].TextRectF.Height * 2, this.Items[i].TextRectF.Height * 2), 270, 90);
          back_gp.AddLine(this.Items[i].TextRectF.X, this.Items[i].TextRectF.Bottom, this.Items[i].TextRectF.X, this.Items[i].TextRectF.Y);
          g.FillPath(back_sb, back_gp);
          back_gp.Dispose();

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)this.Items[i].TextRectF.X, (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
        
        else if (this.Style == StyleType.Leaf)
        
          GraphicsPath back_gp = new GraphicsPath();
          back_gp.AddArc(new RectangleF(this.Items[i].TextRectF.Right - this.Items[i].TextRectF.Height * 2, this.Items[i].TextRectF.Y, this.Items[i].TextRectF.Height * 2, this.Items[i].TextRectF.Height * 2), 270, 90);
          back_gp.AddArc(new RectangleF(this.Items[i].TextRectF.X, -this.Items[i].TextRectF.Height, this.Items[i].TextRectF.Height * 2, this.Items[i].TextRectF.Height * 2), 90, 90);
          g.FillPath(back_sb, back_gp);
          back_gp.Dispose();

          TextRenderer.DrawText(g, this.Items[i].Text, this.TextFont, new Rectangle((int)(this.Items[i].TextRectF.X + this.Items[i].TextRectF.Height / 2), (int)this.Items[i].TextRectF.Y, (int)this.Items[i].TextRectF.Width, (int)this.Items[i].TextRectF.Height), color, TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter);
        

        back_sb.Dispose();
      

    

    /// <summary>
    /// 初始化导航选项rect
    /// </summary>
    private void InitializeItemsSize()
    
      Graphics g = this.CreateGraphics();
      RectangleF rect = g.VisibleClipBounds;

      float b = this.BorderShow ? this.BorderWidth : 0;
      float start_x = b;
      float arrows_h = rect.Height - b * 2;
      float arrows_w = arrows_h / 2;

      for (int i = 0; i < this.Items.Count; i++)
      
        Size text_size = TextRenderer.MeasureText(g, this.Items[i].Text, this.TextFont, new Size(0, 0), TextFormatFlags.LeftAndRightPadding);
        if (this.ItemMinWidth != 0)
        
          text_size.Width = Math.Max(text_size.Width, this.ItemMinWidth);
        
        if (this.ItemMaxWidth != 0)
        
          text_size.Width = Math.Min(text_size.Width, this.ItemMaxWidth);
        

        if (this.Style == StyleType.Normal)
        
          this.Items[i].TextRectF = new RectangleF(start_x, b, text_size.Width, arrows_h);
          this.Items[i].ArrowsRectF = new RectangleF(this.Items[i].TextRectF.Right, (rect.Height - text_size.Height) / 2, text_size.Height / 3 * 2, text_size.Height);
          start_x += text_size.Width + arrows_w;
        
        else if (this.Style == StyleType.Parallelogram || this.Style == StyleType.Arrows || this.Style == StyleType.RoundCap)
        

          this.Items[i].TextRectF = new RectangleF(start_x, b, text_size.Width + arrows_w * 2, arrows_h);
          start_x += text_size.Width + arrows_w + 2;
        
        else if (this.Style == StyleType.Quadrangle || this.Style == StyleType.Circular)
        
          this.Items[i].TextRectF = new RectangleF(start_x, b, text_size.Width + arrows_h / 2, arrows_h);
          start_x += text_size.Width + arrows_h / 2 + 2;
        
        else if (this.Style == StyleType.Quadrangle || this.Style == StyleType.Leaf)
        
          this.Items[i].TextRectF = new RectangleF(start_x, b, text_size.Width + arrows_h, arrows_h);
          start_x += text_size.Width + arrows_h - arrows_w / 2;
        
      
      g.Dispose();
      this.Invalidate();
    

    protected override void OnResize(EventArgs e)
    
      base.OnResize(e);
      this.InitializeItemsSize();
    

    protected override void OnClick(EventArgs e)
    
      base.OnClick(e);

      Point point = this.PointToClient(Control.MousePosition);
      if (this.navigationItemClick != null)
      
        for (int i = 0; i < this.Items.Count; i++)
        
          if (this.Items[i].TextRectF.Contains(point))
          
            this.navigationItemClick(this, new NavigationItemEventArgs()  Item = this.Items[i] );
            break;
          
        
      
    

    protected override void OnMouseMove(MouseEventArgs e)
    
      base.OnMouseMove(e);
      bool isenter = false;
      for (int i = 0; i < this.Items.Count; i++)
      
        if (this.Items[i].TextRectF.Contains(e.Location))
        

          this.Items[i].MoveStatus = ItemType.Enter;
          isenter = true;
        
        else
        
          this.Items[i].MoveStatus = this.Items[i].Selected ? ItemType.Selected : ItemType.Normal;
        
      
      if (isenter)
      
        if (this.Cursor != Cursors.Hand)
        
          this.Cursor = Cursors.Hand;
        
      
      else
      
        this.Cursor = Cursors.Default;
      
      this.Invalidate();
    

    protected override void OnMouseLeave(EventArgs e)
    
      base.OnMouseLeave(e);
      this.Cursor = Cursors.Default;
      for (int i = 0; i < this.Items.Count; i++)
      
        this.Items[i].MoveStatus = this.Items[i].Selected ? ItemType.Selected : ItemType.Normal;
      
      this.Invalidate();
    

    protected override void Dispose(bool disposing)
    
      if (disposing && (components != null))
      
        components.Dispose();
      
      base.Dispose(disposing);
    

    /// <summary>
    /// 导航选项集合
    /// </summary>
    [Description("导航选项集合")]
    [Editor(typeof(CollectionEditorExt), typeof(UITypeEditor))]
    public sealed class NavigationItemCollection : IList, ICollection, IEnumerable
    
      private ArrayList navigationItemList = new ArrayList();
      private NavigationBarExt owner;

      public NavigationItemCollection(NavigationBarExt owner)
      
        this.owner = owner;
      

      #region IEnumerable

      public IEnumerator GetEnumerator()
      
        NavigationItem[] listArray = new NavigationItem[this.navigationItemList.Count];
        for (int index = 0; index < listArray.Length; ++index)
          listArray[index] = (NavigationItem)this.navigationItemList[index];
        return listArray.GetEnumerator();
      

      #endregion

      #region ICollection

      public void CopyTo(Array array, int index)
      
        for (int i = 0; i < this.Count; i++)
          array.SetValue(this.navigationItemList[i], i + index);
      

      public int Count
      
        get
        
          return this.navigationItemList.Count;
        
      

      public bool IsSynchronized
      
        get
        
          return false;
        
      

      public object SyncRoot
      
        get
        
          return (object)this;
        
      

      #endregion

      #region IList

      public int Add(object value)
      
        NavigationItem navigationItem = (NavigationItem)value;
        this.navigationItemList.Add(navigationItem);
        this.owner.InitializeItemsSize();
        return this.Count - 1;
      

      public void Clear()
      
        this.navigationItemList.Clear();
        this.owner.InitializeItemsSize();
      

      public bool Contains(object value)
      
        return this.IndexOf(value) != -1;
      

      public int IndexOf(object value)
      
        return this.navigationItemList.IndexOf(value);
      

      public void Insert(int index, object value)
      
        throw new NotImplementedException();
      

      public bool IsFixedSize
      
        get  return false; 
      

      public bool IsReadOnly
      
        get  return false; 
      

      public void Remove(object value)
      
        if (!(value is NavigationItem))
          return;
        this.navigationItemList.Remove((NavigationItem)value);
        this.owner.InitializeItemsSize();
      

      public void RemoveAt(int index)
      
        this.navigationItemList.RemoveAt(index);
        this.owner.InitializeItemsSize();
      

      public NavigationItem this[int index]
      
        get
        
          return (NavigationItem)this.navigationItemList[index];
        
        set
        
          this.navigationItemList[index] = (NavigationItem)value;
          this.owner.InitializeItemsSize();
        
      

      object IList.this[int index]
      
        get
        
          return (object)this.navigationItemList[index];
        
        set
        
          this.navigationItemList[index] = (NavigationItem)value;
          this.owner.InitializeItemsSize();
        
      

      #endregion

    

    /// <summary>
    /// 实际坐标
    /// </summary>
    [Description("实际坐标")]
    public class NavigationItem
    
      private string text;
      /// <summary>
      /// 文本
      /// </summary>
      [DefaultValue("")]
      [Description("文本")]
      public string Text
      
        get  return this.text; 
        set
        
          if (this.text == value)
            return;
          this.text = value;
        
      

      private Color textColor = Color.Empty;
      /// <summary>
      /// 文本颜色
      /// </summary>
      [DefaultValue(typeof(Color), "Empty")]
      [Description("文本颜色")]
      [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
      public Color TextColor
      
        get  return this.textColor; 
        set
        
          if (this.textColor == value)
            return;
          this.textColor = value;
        
      

      private Color textBackColor = Color.Empty;
      /// <summary>
      /// 文本背景颜色
      /// </summary>
      [DefaultValue(typeof(Color), "Empty")]
      [Description("文本背景颜色")]
      [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
      public Color TextBackColor
      
        get  return this.textBackColor; 
        set
        
          if (this.textBackColor == value)
            return;
          this.textBackColor = value;
        
      

      private Color textEnterColor = Color.Empty;
      /// <summary>
      /// 鼠标进入文本颜色
      /// </summary>
      [DefaultValue(typeof(Color), "Empty")]
      [Description("鼠标进入文本颜色")]
      [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
      public Color TextEnterColor
      
        get  return this.textEnterColor; 
        set
        
          if (this.textEnterColor == value)
            return;
          this.textEnterColor = value;
        
      

      private Color textEnterBackColor = Color.Empty;
      /// <summary>
      /// 鼠标进入文本背景颜色
      /// </summary>
      [DefaultValue(typeof(Color), "Empty")]
      [Description("鼠标进入文本背景颜色")]
      [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
      public Color TextEnterBackColor
      
        get  return this.textEnterBackColor; 
        set
        
          if (this.textEnterBackColor == value)
            return;
          this.textEnterBackColor = value;
        
      

      private Color textSelectedColor = Color.Empty;
      /// <summary>
      /// 文本选中颜色
      /// </summary>
      [DefaultValue(typeof(Color), "Empty")]
      [Description("文本选中颜色")]
      [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
      public Color TextSelectedColor
      
        get  return this.textSelectedColor; 
        set
        
          if (this.textSelectedColor == value)
            return;
          this.textSelectedColor = value;
        
      

      private Color textSelectedBackColor = Color.Empty;
      /// <summary>
      /// 文本选中背景颜色
      /// </summary>
      [DefaultValue(typeof(Color), "Empty")]
      [Description("文本选中背景颜色")]
      [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
      public Color TextSelectedBackColor
      
        get  return this.textSelectedBackColor; 
        set
        
          if (this.textSelectedBackColor == value)
            return;
          this.textSelectedBackColor = value;
        
      

      private bool selected = false;
      /// <summary>
      /// 文本是否选中
      /// </summary>
      [DefaultValue(false)]
      [Description("文本是否选中")]
      public bool Selected
      
        get  return this.selected; 
        set
        
          if (this.selected == value)
            return;
          this.selected = value;
        
      

      private ItemType textType = ItemType.Normal;
      /// <summary>
      /// 导航选项状态
      /// </summary>
      [Browsable(false)]
      [DefaultValue(ItemType.Normal)]
      [Description("导航选项状态")]
      public ItemType MoveStatus
      
        get  return this.textType; 
        set
        
          if (this.textType == value)
            return;
          this.textType = value;
        
      

      private RectangleF textRectF;
      /// <summary>
      /// 导航选项RectF
      /// </summary>
      [Browsable(false)]
      [Description("导航选项RectF")]
      public RectangleF TextRectF
      
        get  return this.textRectF; 
        set
        
          if (this.textRectF == value)
            return;
          this.textRectF = value;
        
      

      private RectangleF arrowsRectF;
      /// <summary>
      /// 符号RectF
      /// </summary>
      [Browsable(false)]
      [Description("符号RectF")]
      public RectangleF ArrowsRectF
      
        get  return this.arrowsRectF; 
        set
        
          if (this.arrowsRectF == value)
            return;
          this.arrowsRectF = value;
        
      

    

    /// <summary>
    /// 导航选项状态
    /// </summary>
    [Description("导航选项状态")]
    public enum ItemType
    
      /// <summary>
      /// 正常
      /// </summary>
      Normal,
      /// <summary>
      /// 鼠标进入
      /// </summary>
      Enter,
      /// <summary>
      /// 选中
      /// </summary>
      Selected
    

    /// <summary>
    /// 导航样式
    /// </summary>
    [Description("导航样式")]
    public enum StyleType
    
      /// <summary>
      /// 正常
      /// </summary>
      Normal,
      /// <summary>
      /// 平行四边形
      /// </summary>
      Parallelogram,
      /// <summary>
      /// 箭头
      /// </summary>
      Arrows,
      /// <summary>
      /// 圆帽
      /// </summary>
      RoundCap,
      /// <summary>
      /// 四边形
      /// </summary>
      Quadrangle,
      /// <summary>
      /// 圆角
      /// </summary>
      Circular,
      /// <summary>
      /// 叶子
      /// </summary>
      Leaf
    

    /// <summary>
    /// 导航选项单击事件参数
    /// </summary>
    [Description("导航选项单击事件参数")]
    public class NavigationItemEventArgs : EventArgs
    
      /// <summary>
      /// 导航选项
      /// </summary>
      [Description("导航选项")]
      public NavigationItem Item  get; set; 
    
  

 

源码下载:向导导航栏控件.zip

以上是关于向导导航栏控件----------WinForm控件开发系列的主要内容,如果未能解决你的问题,请参考以下文章

winform标题栏用的是啥控件?

如何实现winform 可隐藏导航栏

winform 如何制作一个带标题栏的Panel控件?

c# winform 用listview做导航界面,控件上下移动后 顺序不对?

如何检测 jQuery 是不是在 WinForm WebBrowser 控件中导航到的文档中?

关于edgesForExtendedLayouttranslucentextendedLayoutIncludesOpaqueBarsautomaticallyAdjustsScrollView(代码