C#如何引用父子容器控件复用按钮逻辑减少冗余代码?
实现方案
方案1:按你预想的JS式遍历控件逻辑实现
首先实现通用子控件查找方法,支持递归查找容器内指定类型的子控件:
// 放在窗体类里的通用辅助方法 private T FindChildControl<T>(Control parent) where T : Control { foreach (Control child in parent.Controls) { if (child is T target) return target; var nested = FindChildControl<T>(child); if (nested != null) return nested; } return null; }
重构后的状态切换方法如下:
private void ToggleFixedButton(Control parentContainer, bool isFixed, string prefName) { // 自动匹配容器内的对应控件,按你实际用的控件类型调整泛型参数即可 var dotLabel = FindChildControl<Label>(parentContainer); var areaPanel = FindChildControl<Panel>(parentContainer); var textControl = FindChildControl<TextBox>(parentContainer); dotLabel.ForeColor = isFixed ? Color.FromArgb(80, 214, 0) : Color.FromArgb(244, 180, 0); dotLabel.TextAlign = isFixed ? ContentAlignment.TopLeft : ContentAlignment.TopRight; areaPanel.BackgroundImage = isFixed ? Properties.Resources.green_btn_bk_sm : Properties.Resources.yellow_btn_bk_sm; textControl.Text = isFixed ? "Fixed!" : "Fix it!"; PrefMatch(prefName, isFixed ? "yes" : "no", dotLabel); }
所有这类按钮共用同一个点击事件即可,不用每个按钮单独写。可以把控件对应的配置名存在按钮的Tag属性里(设计器里直接给每个按钮的Tag赋值即可,比如F1按钮的Tag填KillF1Help):
private void CommonFixBtn_Click(object sender, EventArgs e) { var clickBtn = (Control)sender; string prefName = clickBtn.Tag.ToString(); // 提前配置所有功能的判断、开关逻辑映射 var funcConfig = new Dictionary<string, (Func<bool> IsActive, Action Enable, Action Disable)> { {"KillF1Help", (regStuff.F1HelpActive, regStuff.KillF1, regStuff.RestoreF1)}, // 新增按钮只需要在这里加一行配置即可,不用写新的逻辑代码 {"KillOtherFunc", (regStuff.OtherFuncActive, regStuff.KillOther, regStuff.RestoreOther)} }; var currentFunc = funcConfig[prefName]; if (currentFunc.IsActive()) { prefs.SetPref(prefName, "no"); currentFunc.Disable(); ToggleFixedButton(clickBtn.Parent, false, prefName); } else { prefs.SetPref(prefName, "yes"); currentFunc.Enable(); ToggleFixedButton(clickBtn.Parent, true, prefName); } }
方案2(更推荐):封装自定义用户控件
直接把这类按钮用到的Label、Panel、文本框封装成一个自定义用户控件,对外暴露PrefName、IsFixed、开关逻辑委托等属性,30个按钮直接拖这个自定义控件到窗体即可,完全不需要重复写UI控制逻辑,后续改样式也只需要改自定义控件一处,所有按钮自动同步。
内容的提问来源于stack exchange,提问作者not_a_generic_user
相关产品推荐
相关产品推荐

