// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED. // THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License. // LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License") // YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License. // YOU MAY OBTAIN A COPY OF THE LICENSE AT // // http://www.apache.org/licenses/LICENSE-2.0 // // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE // DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND // LIMITATIONS UNDER THE License. // GITEE: https://gitee.com/antdui/AntdUI // GITHUB: https://github.com/AntdUI/AntdUI // CSDN: https://blog.csdn.net/v_132 // QQ: 17379620 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing.Design; using System.Windows.Forms; namespace AntdUI { /// /// Dropdown 选择器 /// /// 向下弹出的列表。 [Description("Dropdown 下拉菜单")] [ToolboxItem(true)] [DefaultEvent("SelectedValueChanged")] public class Dropdown : Button, SubLayeredForm { #region 属性 /// /// 列表自动宽度 /// [Description("列表自动宽度"), Category("行为"), DefaultValue(true)] public bool ListAutoWidth { get; set; } = true; /// /// 触发下拉的行为 /// [Description("触发下拉的行为"), Category("行为"), DefaultValue(Trigger.Click)] public Trigger Trigger { get; set; } = Trigger.Click; /// /// 菜单弹出位置 /// [Description("菜单弹出位置"), Category("行为"), DefaultValue(TAlignFrom.BL)] public TAlignFrom Placement { get; set; } = TAlignFrom.BL; /// /// 列表最多显示条数 /// [Description("列表最多显示条数"), Category("行为"), DefaultValue(4)] public int MaxCount { get; set; } = 4; /// /// 下拉箭头是否显示 /// [Description("下拉箭头是否显示"), Category("外观"), DefaultValue(false)] public bool DropDownArrow { get; set; } = false; /// /// 点击到最里层(无节点才能点击) /// [Description("点击到最里层(无节点才能点击)"), Category("行为"), DefaultValue(false)] public bool ClickEnd { get; set; } = false; #region 数据 BaseCollection? items; /// /// 数据 /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor", typeof(UITypeEditor))] [Description("集合"), Category("数据")] public BaseCollection Items { get { items ??= new BaseCollection(); return items; } set => items = value; } /// /// SelectedValue 属性值更改时发生 /// [Description("SelectedValue 属性值更改时发生"), Category("行为")] public event ObjectNEventHandler? SelectedValueChanged = null; internal void DropDownChange(object value) { SelectedValueChanged?.Invoke(this, new ObjectNEventArgs(value)); select_x = 0; subForm = null; } #endregion #endregion #region 动画 LayeredFormSelectDown? subForm = null; public ILayeredForm? SubForm() => subForm; ITask? ThreadExpand = null; bool expand = false; bool Expand { get => expand; set { if (expand == value) return; expand = value; if (ShowArrow && Config.Animation) { ThreadExpand?.Dispose(); var t = Animation.TotalFrames(10, 100); if (value) { ThreadExpand = new ITask((i) => { ArrowProg = Animation.Animate(i, t, 2F, AnimationType.Ball) - 1F; Invalidate(); return true; }, 10, t, () => { ArrowProg = 1; Invalidate(); }); } else { ThreadExpand = new ITask((i) => { ArrowProg = -(Animation.Animate(i, t, 2F, AnimationType.Ball) - 1F); Invalidate(); return true; }, 10, t, () => { ArrowProg = -1; Invalidate(); }); } } else ArrowProg = value ? 1F : -1F; } } #endregion #region 鼠标 protected override void OnMouseClick(MouseEventArgs e) { if (Trigger == Trigger.Click) { ClickDown(); return; } base.OnMouseClick(e); } protected override void OnMouseEnter(EventArgs e) { if (Trigger == Trigger.Hover && subForm == null) ClickDown(); base.OnMouseEnter(e); } protected override void OnLostFocus(EventArgs e) { subForm?.IClose(); base.OnLostFocus(e); } internal int select_x = 0; void ClickDown() { if (items != null && items.Count > 0) { if (subForm == null) { var objs = new List(items.Count); foreach (var it in items) { objs.Add(it); } Expand = true; subForm = new LayeredFormSelectDown(this, Radius, objs); subForm.Disposed += (a, b) => { select_x = 0; subForm = null; Expand = false; }; subForm.Show(this); } else subForm?.IClose(); } else subForm?.IClose(); } #endregion } }