MetroMenuElement.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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.Reflection;
  11. using System.Threading;
  12. namespace PaintDotNet.Preview2
  13. {
  14. public partial class MetroMenuElement : UserControl
  15. {
  16. public static Color SelectColor
  17. {
  18. get; set;
  19. } = Color.FromArgb(51, 102, 153);
  20. public static Color ActiveColor
  21. {
  22. get; set;
  23. } = Color.FromArgb(51, 152, 153);
  24. public static Color HightColor
  25. {
  26. get; set;
  27. } = Color.FromArgb(51, 132, 153);
  28. public static Color DefaultColor
  29. { get; set; } = Color.Transparent;
  30. public MetroMenuElement()
  31. {
  32. InitializeComponent();
  33. }
  34. public override string Text
  35. {
  36. get
  37. {
  38. return lbTitle.Text;
  39. }
  40. set
  41. {
  42. lbTitle.Text = value;
  43. }
  44. }
  45. public string Title
  46. {
  47. get
  48. {
  49. return lbTitle.Text;
  50. }
  51. set
  52. {
  53. lbTitle.Text = value;
  54. }
  55. }
  56. public Image Icon
  57. {
  58. get
  59. {
  60. return picIcon.Image;
  61. }
  62. set
  63. {
  64. picIcon.Image = value;
  65. }
  66. }
  67. bool selected;
  68. public event EventHandler SelectedChanged;
  69. public bool Selectable = false;
  70. public bool Selected
  71. {
  72. get
  73. {
  74. return selected & Selectable;
  75. }
  76. set
  77. {
  78. if (selected == value) return;
  79. selected = value;
  80. if (SelectedChanged != null)
  81. {
  82. SelectedChanged(this, new EventArgs());
  83. }
  84. if (Selectable)
  85. this.BackColor = selected ? SelectColor : DefaultColor;
  86. }
  87. }
  88. protected override void OnLoad(EventArgs e)
  89. {
  90. foreach (Control child in Controls)
  91. {
  92. child.MouseEnter += Child_MouseEnter;
  93. child.MouseLeave += Child_MouseLeave;
  94. child.Click += Child_Click;
  95. }
  96. base.OnLoad(e);
  97. }
  98. private void Child_Click(object sender, EventArgs e)
  99. {
  100. Selected = !Selected;
  101. Delegate[] list = GetObjectEventList(this, "EventClick", typeof(Control));
  102. foreach (var item in list)
  103. {
  104. item.DynamicInvoke(sender, e);
  105. }
  106. }
  107. public static Delegate[] GetObjectEventList(object p_Object, string p_EventName, Type p_EventType)
  108. {
  109. PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
  110. if (_PropertyInfo != null)
  111. {
  112. object _EventList = _PropertyInfo.GetValue(p_Object, null);
  113. if (_EventList != null && _EventList is EventHandlerList)
  114. {
  115. EventHandlerList _List = (EventHandlerList)_EventList;
  116. FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
  117. if (_FieldInfo == null) return null;
  118. Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
  119. if (_ObjectDelegate == null) return null;
  120. return _ObjectDelegate.GetInvocationList();
  121. }
  122. }
  123. return null;
  124. }
  125. private void Child_MouseLeave(object sender, EventArgs e)
  126. {
  127. OnMounseLeave();
  128. }
  129. private void Child_MouseEnter(object sender, EventArgs e)
  130. {
  131. OnMouseEnter();
  132. }
  133. private void MetroMenuElement_MouseEnter(object sender, EventArgs e)
  134. {
  135. OnMouseEnter();
  136. }
  137. private void OnMouseEnter()
  138. {
  139. if (!Selected)
  140. {
  141. this.BackColor = ActiveColor;
  142. }
  143. }
  144. private void MetroMenuElement_MouseLeave(object sender, EventArgs e)
  145. {
  146. OnMounseLeave();
  147. }
  148. private void OnMounseLeave()
  149. {
  150. if (!Selected)
  151. {
  152. this.BackColor = DefaultColor;
  153. }
  154. }
  155. private void MetroMenuElement_Click(object sender, EventArgs e)
  156. {
  157. Selected = !Selected;
  158. }
  159. /// <summary>
  160. /// 按压回弹特性
  161. /// </summary>
  162. public void PressDownThenBack(int ms = 1000)
  163. {
  164. BackColor = SelectColor;
  165. new Task(() =>
  166. {
  167. Thread.Sleep(ms);
  168. this.Invoke(new Action(() =>
  169. {
  170. BackColor = DefaultBackColor;
  171. }));
  172. }).Start();
  173. }
  174. }
  175. }