C# WPF如何消除冗余switch分支 按名称动态访问控件
简化冗余switch分支、通过字符串访问控件的实现方案
你当前的冗余代码完全可以全部删除,不需要写任何case分支,核心是利用框架自带的按名称查找控件能力,配合通用逻辑抽离实现。
实现逻辑
你的控件已经遵循Pg3/Pg4…Pg14的统一命名规则,直接拼接目标控件名,从窗口/页面的控件树中查找对应实例即可,所有测试项的样式设置可以共用同一段逻辑。
WPF 环境可直接用如下代码替换原有switch块:
// 如果你拿到的是原始结果字符串(格式为"Px-PASS/FAIL"),可以直接拆分解析,不需要单独传参 string[] resultSegments = TstResultRaw.Split('-'); int pageNum = int.Parse(resultSegments[0].TrimStart('P')); bool testPassed = resultSegments[1] == "PASS"; // 拼接目标控件名,查找对应按钮实例 string targetBtnName = $"Pg{pageNum}"; Button targetButton = this.FindName(targetBtnName) as Button; if (targetButton == null) { // 按需处理控件找不到的异常场景,比如打日志、抛错 throw new InvalidOperationException($"未找到对应测试项按钮:{targetBtnName}"); } // 统一设置样式,无冗余分支 targetButton.Background = testPassed ? Brushes.SeaGreen : Brushes.Red; targetButton.Foreground = Brushes.White;
WinForm 环境仅需要替换控件查找的逻辑即可:
// WinForm 递归查找所有子容器中的目标控件 Button targetButton = this.Controls.Find(targetBtnName, true).FirstOrDefault() as Button; // 后续样式设置逻辑和WPF完全一致
注意事项
- 新增测试项时,只要保证对应按钮命名为
Pg+测试编号的格式,不需要修改这段逻辑,直接就能适配 - WPF的
FindName方法、WinForm的Controls.Find方法(第二个参数传true)都会自动递归遍历嵌套容器中的控件,不需要手动逐层查找Grid、Panel等父容器 - 公共样式逻辑如果后续要调整(比如改失败颜色、加字体加粗效果),只需要改这一处代码,不需要逐个case修改
内容的提问来源于stack exchange,提问作者Mark Stevens
相关产品推荐
相关产品推荐

