You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:43:33