UWP代码后置创建Path.Data能否简化?冗余代码优化咨询
简化UWP中Canvas绘制Path的冗余代码方案
嘿,我太懂你这种被重复代码烦到的感觉了——switch里四次一模一样的逻辑,确实够啰嗦的。咱们来拆解问题,找到最适合你的简化方案:
首先,你尝试的单行代码报错,是因为GeometryGroup并没有接受单个Geometry对象的构造函数,它的构造函数要么是空参,要么接受一个IEnumerable<Geometry>类型的集合。你直接传单个RectangleGeometry,编译器自然不认。
下面给你几个可行的简化思路:
1. 用集合初始化器快速构建GeometryGroup
这是最直接的简化方式,不用分开写创建对象、赋值Rect、添加到Children这些步骤,紧凑几行就能搞定:
path.Data = new GeometryGroup { Children = { new RectangleGeometry(new Rect(left, top, width, height)) } };
集合初始化器会自动帮你调用Children.Add(),语法简洁还符合C#的规范。
2. 封装成复用方法(彻底解决switch重复问题)
既然你要在switch-case里重复四次,最好的办法是把这段逻辑抽成一个独立方法,之后每个case只需要调用方法就行:
private Geometry BuildDoorGeometry(double left, double top, double width, double height) { return new GeometryGroup { Children = { new RectangleGeometry(new Rect(left, top, width, height)) } }; }
然后在你的switch里,每个case只需要写:
path.Data = BuildDoorGeometry(对应left, top, width, height);
这样不仅代码量骤减,以后要修改门的绘制逻辑,只需要改这一个方法就行,维护性拉满。
3. 特殊场景:如果只有单个几何图形,直接省略GeometryGroup
如果你的doorGroup里永远只会有这一个RectangleGeometry,那其实完全不需要GeometryGroup,直接把矩形几何对象赋值给path.Data就行:
path.Data = new RectangleGeometry(new Rect(left, top, width, height));
这是最精简的写法,但要注意:如果之后你需要给门添加其他几何元素(比如门把手),那还是得用GeometryGroup,所以这个方案适合确定不会扩展的场景。
选哪个方案看你的实际需求——如果只是临时简化,用第一种;如果要彻底解决重复问题,第二种绝对是最优解;如果场景简单,第三种最省事。
内容的提问来源于stack exchange,提问作者Keven M
相关产品推荐
相关产品推荐

