是否有一个核心C#矩形类';它不应该是只读的';T

是否有一个核心C#矩形类';它不应该是只读的';T,c#,C#,点具有X和Y,可以更改它们。但是矩形具有左侧,顶部,右侧,底部只读。为了让事情变得更有趣,宽度和高度是可写的。因此,要移动一个矩形,您需要偏移并更改宽度和高度,此时您可以相应地更改TLRB值 是否有我缺少的真正的矩形类可以写入这些值,这样我就不必在更新内部值时发挥创造性了?像RECT? PS:当前使用的是Rectangle.FromLTRB,但我键入的内容比我应该键入的要多,只需更改Top值。编辑:似乎您是对的,并且提供了更好的解决方案,在不同的情况下,您可以编写自己的Rectangle类: c

具有
X
Y
,可以更改它们。但是
矩形
具有
左侧
顶部
右侧
底部
只读。为了让事情变得更有趣,
宽度
高度
是可写的。因此,要移动一个
矩形
,您需要
偏移
并更改
宽度
高度
,此时您可以相应地更改
TLRB

是否有我缺少的真正的
矩形
类可以写入这些值,这样我就不必在更新内部值时发挥创造性了?像
RECT


PS:当前使用的是
Rectangle.FromLTRB
,但我键入的内容比我应该键入的要多,只需更改
Top
值。

编辑:似乎您是对的,并且提供了更好的解决方案,在不同的情况下,您可以编写自己的Rectangle类:

class Point
{
    public double X;
    public double Y;
}

class Rectangle
{
    public Point TopLeft;
    public double Width;
    public double Height;
}

然后,如果需要,可以创建返回点的方法。如果您想修改其行为,还可以将该类作为原始类的包装器。

您可以执行以下操作:

Rectangle initialRect;

....some other code


initialRect = new Rectangle(new Point(0,0), 100, 100);

具有这些可设置的公共属性
X
Y
宽度
高度

不可设置的属性有
Top
Bottom
Left、
Right
。尽管这些都是通过可设置属性间接设置的。如果查看上面链接的
矩形
MSDN文章,您可以看到如何计算不可设置的属性

  • Top
    只是
    Y
  • 底部
    正好是
    Y
    -
    高度
  • 左侧
    只是
    X
  • Right
    只是x组件
    x
    +
    宽度

我认为,您可以在已经定义的
Rectangle
类中通过设置可设置的属性以及计算其他不可设置属性的方式来完成所有需要的操作

如果您谈论的是System.Drawing.Rectangle结构,它具有可写的X和Y属性,就像Point一样。

是的,您缺少了一些东西。 Top是只读的,但它是只读的

public int Top
{
    get
    {
        return this.Y;
    }
}
Y是可写的。所以,如果你想改变顶部,只需改变Y

public int Left
{
    get
    {
        return this.X;
    }
}

X是可写的。宽度和高度也是可写的。如果您坚持使用Top==Y/Left==X+宽度+高度,则可以毫无问题地更改现有矩形(我猜是System.Drawing矩形)

只需创建一个新实例并将其分配给旧实例-点和矩形都是结构,所以应该是不可变包装方法或扩展方法?@BrokenGlass
Point
具有
X
Y
可写<代码>矩形具有等效的只读成员。什么是不可变的?我知道,这就是为什么我问核心是否有任何东西。仅仅因为有人做出了设计决定,就不得不写一个可写的
矩形
。。。这不是一个很好的选择。现在只使用C#7天(C++已经15年了),我想知道我是否遗漏了什么……你可以尝试刮下矩形,并将其用于自己的实现。你说的是
System.Windows.Shapes.Rectangle
还是另一个矩形类?@BlueTrin似乎是的!我知道我错过了什么。我已经习惯了
TLRB
来自
RECT
TLRB
,以至于我甚至没有注意到其他人。谢谢附言:最好的藏身之地是在看得见的地方。。。绝对地啊,所以Top&Y等毕竟是有区别的。。我一直在想,但从来没有费心去查它。
X
Y
类似于
,但
不类似,后者是计算值。应该可以直接将
设置为Right
Bottom
,并使宽度和高度自动收缩/扩展以响应,但实际上不行,因为.NET的矩形实现存在缺陷。因此,这个问题是正确的,并且仍然存在:有更好的选择吗?但是修改X和Y会移动矩形。我相信他想要的属性只是修改顶部、底部、左侧或右侧,同时保持其他属性不变。
public int Top
{
    get
    {
        return this.Y;
    }
}
public int Left
{
    get
    {
        return this.X;
    }
}