123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Reflection;
- using System.Threading;
- namespace PaintDotNet.Preview2
- {
- public partial class MetroMenuElement : UserControl
- {
- public static Color SelectColor
- {
- get; set;
- } = Color.FromArgb(51, 102, 153);
- public static Color ActiveColor
- {
- get; set;
- } = Color.FromArgb(51, 152, 153);
- public static Color HightColor
- {
- get; set;
- } = Color.FromArgb(51, 132, 153);
- public static Color DefaultColor
- { get; set; } = Color.Transparent;
- public MetroMenuElement()
- {
- InitializeComponent();
- }
- public override string Text
- {
- get
- {
- return lbTitle.Text;
- }
- set
- {
- lbTitle.Text = value;
- }
- }
- public string Title
- {
- get
- {
- return lbTitle.Text;
- }
- set
- {
- lbTitle.Text = value;
- }
- }
- public Image Icon
- {
- get
- {
- return picIcon.Image;
- }
- set
- {
- picIcon.Image = value;
- }
- }
- bool selected;
- public event EventHandler SelectedChanged;
- public bool Selectable = false;
- public bool Selected
- {
- get
- {
- return selected & Selectable;
- }
- set
- {
- if (selected == value) return;
- selected = value;
- if (SelectedChanged != null)
- {
- SelectedChanged(this, new EventArgs());
- }
- if (Selectable)
- this.BackColor = selected ? SelectColor : DefaultColor;
- }
- }
- protected override void OnLoad(EventArgs e)
- {
- foreach (Control child in Controls)
- {
- child.MouseEnter += Child_MouseEnter;
- child.MouseLeave += Child_MouseLeave;
- child.Click += Child_Click;
- }
- base.OnLoad(e);
- }
- private void Child_Click(object sender, EventArgs e)
- {
- Selected = !Selected;
- Delegate[] list = GetObjectEventList(this, "EventClick", typeof(Control));
- foreach (var item in list)
- {
- item.DynamicInvoke(sender, e);
- }
- }
- public static Delegate[] GetObjectEventList(object p_Object, string p_EventName, Type p_EventType)
- {
- PropertyInfo _PropertyInfo = p_Object.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
- if (_PropertyInfo != null)
- {
- object _EventList = _PropertyInfo.GetValue(p_Object, null);
- if (_EventList != null && _EventList is EventHandlerList)
- {
- EventHandlerList _List = (EventHandlerList)_EventList;
- FieldInfo _FieldInfo = p_EventType.GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
- if (_FieldInfo == null) return null;
- Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Object)];
- if (_ObjectDelegate == null) return null;
- return _ObjectDelegate.GetInvocationList();
- }
- }
- return null;
- }
- private void Child_MouseLeave(object sender, EventArgs e)
- {
- OnMounseLeave();
- }
- private void Child_MouseEnter(object sender, EventArgs e)
- {
- OnMouseEnter();
- }
- private void MetroMenuElement_MouseEnter(object sender, EventArgs e)
- {
- OnMouseEnter();
- }
- private void OnMouseEnter()
- {
- if (!Selected)
- {
- this.BackColor = ActiveColor;
- }
- }
- private void MetroMenuElement_MouseLeave(object sender, EventArgs e)
- {
- OnMounseLeave();
- }
- private void OnMounseLeave()
- {
- if (!Selected)
- {
- this.BackColor = DefaultColor;
- }
- }
- private void MetroMenuElement_Click(object sender, EventArgs e)
- {
- Selected = !Selected;
- }
- /// <summary>
- /// 按压回弹特性
- /// </summary>
- public void PressDownThenBack(int ms = 1000)
- {
- BackColor = SelectColor;
- new Task(() =>
- {
- Thread.Sleep(ms);
- this.Invoke(new Action(() =>
- {
- BackColor = DefaultBackColor;
- }));
- }).Start();
- }
- }
- }
|