向导导航栏控件----------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

原文地址:https://www.cnblogs.com/tlmbem/p/11343532.html

时间: 2024-07-31 03:58:31

向导导航栏控件----------WinForm控件开发系列的相关文章

IOS之导航栏中添加UITextView控件bug

今天遇到一个奇怪的问题,如下: 在导航栏控制器的rootviewcontroller中,添加了一个UITextView控件,代码如下: - (void)viewDidLoad { [super viewDidLoad]; self.title =@"Test"; UITextView *textview = [[UITextViewalloc]init]; textview.frame = CGRectMake(10, 100, 300, 200); textview.backgrou

走马灯图片轮播控件----------WinForm控件开发系列

/// <summary> /// 走马灯图片轮播控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Images")] [Description("走马灯图片轮播控件")] public partial class ImageCarouselExt : Control { #region private bool barShow = true; /// <summary>

数字时间控件----------WinForm控件开发系列

/// <summary> /// 数字时间控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Value")] [DefaultEvent("ValueChanged")] [Description("数字时间控件")] public partial class TimeExt : Control { public delegate void EventHand

MAC鱼眼效果菜单控件----------WinForm控件开发系列

/// <summary> /// 鱼眼菜单 /// </summary> [DefaultProperty("Items")] [DefaultEvent("FisheyeItemClick")] [Description("鱼眼菜单")] public partial class FisheyeBarExt : Control { public delegate void EventHandler(object sen

按钮动画控件----------WinForm控件开发系列

public partial class ButtonExt : Button { private AnimationTimer _Animation; /// <summary> /// 动画组件对象 /// </summary> [Description("动画组件对象")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public AnimationT

雷达扫描控件----------WinForm控件开发系列

/// <summary> /// 雷达扫描控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Items")] [Description("雷达扫描控件")] public partial class RadarExt : Control { #region private Color areaColor = Color.LawnGreen; /// <summary>

TabPanel美化控件----------WinForm控件开发系列

/// <summary> /// TabControl /// </summary> [ToolboxItem(true)] [Description("TabControl")] public partial class TabControlExt : TabControl { #region private AnimationTimer animation; /// <summary> /// 动画组件对象 /// </summary&g

Chart实时段分析控件----------WinForm控件开发系列

/// <summary> /// 实时段进度控件 /// </summary> [ToolboxItem(true)] [Description("实时段进度控件")] public partial class ChartExt : Control { #region private Timer interval; /// <summary> /// 定时刷新 /// </summary> [Browsable(false)] [Des

加载等待控件----------WinForm控件开发系列

/// <summary> /// 加载进度控件 /// </summary> [ToolboxItem(true)] [Description("加载进度控件")] [DefaultProperty("Active")] public partial class LoadProgressExt : Control { #region 属性 private LoadProgressType progressType = LoadProgres