diff --git a/SunnyUI/Controls/UICheckBoxGroup.cs b/SunnyUI/Controls/UICheckBoxGroup.cs index 782c623f..6eecf55f 100644 --- a/SunnyUI/Controls/UICheckBoxGroup.cs +++ b/SunnyUI/Controls/UICheckBoxGroup.cs @@ -50,7 +50,7 @@ namespace Sunny.UI /// 索引 /// 文字 /// 是否选中 - public delegate void OnValueChanged(object sender, int index, string text, bool isChecked); + public delegate void OnValueChanged(object sender, CheckBoxGroupEventArgs e); /// /// 值切换事件 @@ -65,6 +65,7 @@ namespace Sunny.UI items.CountChange += Items_CountChange; ForeColor = UIStyles.Blue.CheckBoxForeColor; checkBoxColor = UIStyles.Blue.CheckBoxColor; + hoverColor = UIStyles.Blue.ListItemHoverColor; } private Color checkBoxColor; @@ -85,6 +86,7 @@ namespace Sunny.UI set { SetItemCheckState(index, value); + ValueChanged?.Invoke(this, new CheckBoxGroupEventArgs(index, Items[index].ToString(), this[index], SelectedIndexes.ToArray())); Invalidate(); } } @@ -116,6 +118,7 @@ namespace Sunny.UI CheckStates.Clear(); CheckBoxRects.Clear(); Invalidate(); + ValueChanged?.Invoke(this, new CheckBoxGroupEventArgs(-1, "", false, SelectedIndexes.ToArray())); } /// @@ -139,6 +142,24 @@ namespace Sunny.UI base.SetStyleColor(uiColor); checkBoxColor = uiColor.CheckBoxColor; ForeColor = uiColor.CheckBoxForeColor; + hoverColor = uiColor.ListItemHoverColor; + } + + private Color hoverColor; + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("鼠标滑过填充颜色"), Category("SunnyUI")] + [DefaultValue(typeof(Color), "155, 200, 255")] + public Color HoverColor + { + get => hoverColor; + set + { + hoverColor = value; + Invalidate(); + } } /// @@ -165,6 +186,11 @@ namespace Sunny.UI base.OnPaint(e); if (Items.Count == 0) return; + if (activeIndex >= 0 && CheckBoxRects.ContainsKey(activeIndex)) + { + e.Graphics.FillRectangle(hoverColor, CheckBoxRects[activeIndex]); + } + int startX = StartPos.X; int startY = TitleTop + StartPos.Y; @@ -176,10 +202,16 @@ namespace Sunny.UI int left = startX + ItemSize.Width * columnIndex + ColumnInterval * columnIndex; int top = startY + ItemSize.Height * rowIndex + RowInterval * rowIndex; Rectangle rect = new Rectangle(left, top, ItemSize.Width, ItemSize.Height); + if (CheckBoxRects.NotContainsKey(i)) + CheckBoxRects.Add(i, rect); + else + CheckBoxRects[i] = rect; + int ImageSize = CheckBoxSize; //图标 top = rect.Top + (rect.Height - ImageSize) / 2; + left = rect.Left + 6; Color color = Enabled ? checkBoxColor : foreDisableColor; if (this[i]) @@ -203,14 +235,42 @@ namespace Sunny.UI e.Graphics.DrawRectangle(pn, new Rectangle((int)left + 2, (int)top + 2, ImageSize - 4, ImageSize - 4)); } - e.Graphics.DrawString(text, Font, ForeColor, rect, ContentAlignment.MiddleLeft, ImageSize + 4, 0); - if (CheckBoxRects.NotContainsKey(i)) - CheckBoxRects.Add(i, rect); - else - CheckBoxRects[i] = rect; + e.Graphics.DrawString(text, Font, ForeColor, rect, ContentAlignment.MiddleLeft, ImageSize + 10, 0); + } } + int activeIndex = -1; + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + + int index = -1; + foreach (var item in CheckBoxRects) + { + if (e.Location.InRect(item.Value)) + { + index = item.Key; + break; + } + } + + if (activeIndex != index) + { + activeIndex = index; + Invalidate(); + } + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + + activeIndex = -1; + Invalidate(); + } + protected override void OnMouseClick(MouseEventArgs e) { base.OnMouseClick(e); @@ -220,7 +280,6 @@ namespace Sunny.UI if (e.Location.InRect(pair.Value) && pair.Key >= 0 && pair.Key < items.Count) { this[pair.Key] = !this[pair.Key]; - ValueChanged?.Invoke(this, pair.Key, Items[pair.Key].ToString(), this[pair.Key]); Invalidate(); } } @@ -244,6 +303,11 @@ namespace Sunny.UI } set { + for (int i = 0; i < Items.Count; i++) + { + SetItemCheckState(i, false); + } + foreach (int i in value) { if (i >= 0 && i < Items.Count) @@ -252,6 +316,7 @@ namespace Sunny.UI } } + ValueChanged?.Invoke(this, new CheckBoxGroupEventArgs(-1, "", false, SelectedIndexes.ToArray())); Invalidate(); } } @@ -261,7 +326,7 @@ namespace Sunny.UI /// /// 索引 /// 是否选中 - public void SetItemCheckState(int index, bool isChecked) + private void SetItemCheckState(int index, bool isChecked) { if (index >= 0 && index < Items.Count && CheckStates.NotContainsKey(index)) { @@ -276,7 +341,7 @@ namespace Sunny.UI /// /// 索引 /// 是否选中 - public bool GetItemCheckState(int index) + private bool GetItemCheckState(int index) { if (index >= 0 && index < items.Count && CheckStates.ContainsKey(index)) return CheckStates[index]; @@ -320,12 +385,12 @@ namespace Sunny.UI } } - private Size _itemSize = new Size(150, 35); + private Size _itemSize = new Size(150, 29); /// /// 显示项的大小 /// - [DefaultValue(typeof(Size), "150, 35")] + [DefaultValue(typeof(Size), "150, 29")] [Description("显示项的大小"), Category("SunnyUI")] public Size ItemSize { @@ -372,12 +437,12 @@ namespace Sunny.UI } } - private int rowInterval; + private int rowInterval = 2; /// /// 显示项行之间的间隔 /// - [DefaultValue(0)] + [DefaultValue(2)] [Description("显示项行之间的间隔"), Category("SunnyUI")] public int RowInterval { @@ -399,6 +464,7 @@ namespace Sunny.UI SetItemCheckState(i, true); } + ValueChanged?.Invoke(this, new CheckBoxGroupEventArgs(-1, "", false, SelectedIndexes.ToArray())); Invalidate(); } @@ -412,6 +478,7 @@ namespace Sunny.UI SetItemCheckState(i, false); } + ValueChanged?.Invoke(this, new CheckBoxGroupEventArgs(-1, "", false, SelectedIndexes.ToArray())); Invalidate(); } @@ -425,7 +492,26 @@ namespace Sunny.UI SetItemCheckState(i, !this[i]); } + ValueChanged?.Invoke(this, new CheckBoxGroupEventArgs(-1, "", false, SelectedIndexes.ToArray())); Invalidate(); } } + + public class CheckBoxGroupEventArgs : EventArgs + { + public int Index { get; set; } + + public string Text { get; set; } + public bool Checked { get; set; } + + public int[] SelectedIndexes { get; set; } + + public CheckBoxGroupEventArgs(int index, string text, bool isChecked, int[] indexes) + { + Index = index; + Text = text; + Checked = isChecked; + SelectedIndexes = indexes; + } + } } \ No newline at end of file