AccordionMenu.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Collections;
  11. namespace 优软MES.CustomControl.AccordionMenu
  12. {
  13. public partial class AccordionMenu : UserControl
  14. {
  15. /// <summary>
  16. /// 记录当前功能面板中的按钮
  17. /// </summary>
  18. private ArrayList ArrFunButton = new ArrayList();
  19. /// <summary>
  20. /// 记录当前功能面板中的listview
  21. /// </summary>
  22. private ArrayList ArrFunListView = new ArrayList();
  23. /// <summary>
  24. /// 功能面板的宽度
  25. /// </summary>
  26. private int m_nPanFunWidth = 150;
  27. //功能面板隐藏后的宽度
  28. private int m_nPanFunHideWidth = 150;
  29. public AccordionMenu()
  30. {
  31. InitializeComponent();
  32. }
  33. private void AccordionMenu_Load(object sender, EventArgs e)
  34. {
  35. //设置功能面板的位置和宽带
  36. this.Width = m_nPanFunWidth;
  37. this.Dock = DockStyle.Left;
  38. //记录功能按钮
  39. ArrFunButton.Add(this.button1);
  40. ArrFunButton.Add(this.button2);
  41. ArrFunButton.Add(this.button3);
  42. //记录功能面板中的listview,注意要和上面的button对应
  43. ArrFunListView.Add(this.listView1);
  44. ArrFunListView.Add(this.listView2);
  45. ArrFunListView.Add(this.listView3);
  46. int nCount = ArrFunButton.Count;
  47. //布置各功能按钮的位置和ListView的属性
  48. for (int i = nCount - 1; i >= 0; i--)
  49. {
  50. Button btn = ArrFunButton[i] as Button;
  51. btn.Width = this.Width - 4;
  52. btn.Left = 0;
  53. //将按钮的单击事件和具体代码对应起来
  54. btn.Click += new System.EventHandler(Btn_Click);
  55. if (i == 0)
  56. {
  57. btn.Top = 0;
  58. btn.Anchor = AnchorStyles.Left | AnchorStyles.Top;
  59. }
  60. else
  61. {
  62. if (i == nCount - 1)
  63. btn.Top = this.Height - btn.Height - 4;
  64. else
  65. btn.Top = (ArrFunButton[i + 1] as Button).Top - btn.Height;
  66. btn.Anchor = AnchorStyles.Left | AnchorStyles.Bottom;
  67. }
  68. //鼠标在按钮上移动时,同样判断当前工具条是否隐藏
  69. btn.MouseMove += new MouseEventHandler(FunListView_MouseMove);
  70. //设置listview的anchor属性
  71. ListView lsv = ArrFunListView[i] as ListView;
  72. if (lsv != null)
  73. {
  74. lsv.Anchor = AnchorStyles.Left | AnchorStyles.Top |
  75. AnchorStyles.Right | AnchorStyles.Bottom;
  76. //隐藏功能listview
  77. lsv.Visible = false;
  78. //设置listview双击事件
  79. lsv.DoubleClick += new EventHandler(lsvFun_DoubleClick);
  80. lsv.MouseMove += new MouseEventHandler(FunListView_MouseMove);
  81. }
  82. }
  83. //将第一个功能按钮点一下
  84. (ArrFunButton[0] as Button).PerformClick();
  85. //别忘了打开记时器
  86. this.timer1.Enabled = true;
  87. }
  88. public void Btn_Click(object sender, EventArgs e) {
  89. Button btnNow = sender as Button;
  90. if (btnNow == null)
  91. return;
  92. int nIndex = this.ArrFunButton.IndexOf(btnNow);
  93. //将该按钮前面的置顶
  94. for (int i = 1; i <= nIndex; i++)
  95. {
  96. Button btn = ArrFunButton[i] as Button;
  97. btn.Top = ((Button)ArrFunButton[i - 1]).Bottom;
  98. btn.Anchor = AnchorStyles.Left | AnchorStyles.Top;
  99. }
  100. //将下面的按钮下移
  101. for (int i = ArrFunButton.Count - 1; i > nIndex; i--)
  102. {
  103. Button btn = ArrFunButton[i] as Button;
  104. if (i == ArrFunButton.Count - 1)//最后一个
  105. btn.Top = this.Height - btn.Height - 4;
  106. else
  107. btn.Top = ((Button)ArrFunButton[i + 1]).Top - btn.Height;
  108. btn.Anchor = AnchorStyles.Left |AnchorStyles.Bottom;
  109. }
  110. //显示对应的listview
  111. for (int i = 0; i < ArrFunButton.Count; i++)
  112. {
  113. ListView lsv = ArrFunListView[i] as ListView;
  114. //当前按钮对应的ListView
  115. if (i == nIndex)
  116. {
  117. lsv.Left = 0;
  118. lsv.Width = btnNow.Width;
  119. lsv.Top = btnNow.Bottom;
  120. if (nIndex == ArrFunListView.Count - 1)//最后一个
  121. lsv.Height = this.Height - btnNow.Bottom - 4;
  122. else
  123. lsv.Height = (ArrFunButton[i + 1] as Button).Top - btnNow.Bottom;
  124. //将当前ListView显示出来
  125. if (!lsv.Visible)
  126. lsv.Visible = true;
  127. }
  128. else //隐藏其他listview
  129. {
  130. if (lsv.Visible)
  131. lsv.Visible = false;
  132. }
  133. }
  134. }
  135. //隐藏后鼠标在本工具条上移动时,将它显示出来
  136. private void FunListView_MouseMove(object sender, MouseEventArgs e)
  137. {
  138. if (this.Width == m_nPanFunHideWidth)
  139. {
  140. this.Width = m_nPanFunWidth;
  141. this.timer1.Enabled = true;
  142. }
  143. }
  144. //双击listview后根据当前项执行操作
  145. private void lsvFun_DoubleClick(object sender, System.EventArgs e)
  146. {
  147. //双击后执行一个功能
  148. ListView lsv = sender as ListView;
  149. if (lsv == null)
  150. return;
  151. if (lsv.SelectedItems.Count == 0)
  152. return;
  153. ListViewItem item = lsv.SelectedItems[0];
  154. MessageBox.Show("你双击了:" + item.Text);
  155. }
  156. }
  157. }