无法将控件.Location.x设置为argumentEvent e.x

本文关键字:设置 argumentEvent Location 控件 | 更新日期: 2023-09-27 18:19:30

我正在尝试根据EventArg pictureBox1.Location.X = e.X;的位置在某个事件之后设置控件的位置。

然而,这并不适用于Cannot Modify expression because it is not a variable。但我的印象是,x坐标是一个属性,可以设置。这是怎么回事?

无法将控件.Location.x设置为argumentEvent e.x

试试这个:

pictureBox1.Location = new Point(e.X, pictureBox.Location.Y);

或者如果你不想构建一个新的变量:

Point location = pictureBox1.Location;
location.X = e.X;
pictureBox1.Location = location;

这是因为Point是一个值类型,因此不能只编辑它的一个值,因为它不会传播。它的值是存储的,而不是对该值的引用。你不能只编辑它,你需要重新构建对象。这可以编译,但在任何可能的情况下,它都不会做任何事情,所以编译器会确保你不会犯这个错误。

因为System.Drawing.Point是一种值类型,所以当您调用pictureBox1.Location时,您实际上得到了Point副本。构造了一个全新的对象,并用pictureBox1.Location的字段填充。

因此,编译器试图保护您不做一些愚蠢的事情,因为更改副本的值不会传播到Location的值。

因此,正如其他答案中所提到的,您应该构造一个新的Point并将其分配给Location属性。

这里有些人说Point是一种值类型,你不能更改它的XY,这种解释会让你很困惑。我在这里发布这个答案是为了帮助你理解为什么你不能更改它的Location。这是因为Location是一个返回StructureProperty,而不是对Object的引用,如果你有一个字段,你可以改变它,比如:

public class YourControl : BaseControl {
   public Point Location;
}
//Then you can change the Location your way:
yourControl.Location.X = ....

然而,正如我所说,Location是一个Property,它返回一个值类型(结构)的副本,如下所示:

public class YourControl : BaseControl {
    private Point location;
    public Point Location {
        get {
           return location;//a copy
        }
        set {
           location = value;
        } 
    }
}
//So when you call this:
yourControl.Location
//you will get a copy of your Location, and any changes made on this copy won't affect
//the actual structure, the compiler needs to prevent doing so.
yourControl.Location.X = ... //Should not be executed...

这并不是Location的唯一情况,您可以在所有其他值类型的Properties中找到这个问题。