无法将控件.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坐标是一个属性,可以设置。这是怎么回事?
试试这个:
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
是一种值类型,你不能更改它的X
和Y
,这种解释会让你很困惑。我在这里发布这个答案是为了帮助你理解为什么你不能更改它的Location
。这是因为Location
是一个返回Structure
的Property
,而不是对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中找到这个问题。