为什么我无法直接更改pictureBox1.Location.X的值?

时间:2015-01-31 13:49:04

标签: c#

我想更改pictureBox1.Location的值。结果真让我困惑!

Point player;    
player = pictureBox1.Location;    
player.X += 10; //it works    
pictureBox1.Location.X += 10;//it doesn't work!! Why??    

所以我试试这个:

pictureBox1.Location = player // it works      

有人可以告诉我为什么吗?我只用 head first c#学习了1周的c#,我无法通过互联网或书找到答案。

抱歉,我没有澄清我的问题。我无法建立

pictureBox1.Location.X += 10    .

有一个错误:无法修改'System.Windows.Forms.Control.Location'的返回值,因为它不是变量

我想知道player.X和pictureBox1.Location.X

之间的区别

2 个答案:

答案 0 :(得分:0)

Location的类型为Point,它是一种值类型(struct)。因此,当您访问pictureBox1.Location时,它会返回该位置的副本。在此副本上更改XpictureBox1.Location无效,因此可能不是您想要的;编译器检测到它并发出错误。

您必须将Point视为值,而不是包含值的对象。事实XY属性是不幸的;编写可变结构是一个非常糟糕的主意,但Point可以追溯到.NET的第一个版本,我想MS还没有意识到它有多糟糕......

答案 1 :(得分:0)

Messagebox也有, 左(R / W) 右(R) 底部(R) 顶部(R / W)

R =只读 R / W =读写

您可以通过键入

获取文本框坐标x的最右侧
Int right_x = messagebox.Right;

Messagebox.Left += 10;

它完美无缺。

编辑:

Messagebox.Location struct atleast的源代码有类似的内容。

Public struct Location { public int x, y; }

如果你试试这个

messagebox.Location.x += 10;

您正在尝试修改无用变量,而且它毫无意义。 现在这是可能的

Messagebox.Location = new Point(messagebox.Location.x + 10, messagebox.Location.y);

但我之前提供的方法更快,因为它并不关心y轴。