4

我正在(学校)申请绘制曲线。我通过鼠标单击设置点并将它们的位置添加到顶点列表中。现在我正在使用鼠标向下和鼠标向上的动作来移动点。在鼠标按下时,我发现鼠标的位置是否在顶点列表中任何顶点周围的小正方形(4x4 px)中,然后在鼠标向上时,我想将顶点的坐标更改为我抬起鼠标按钮的坐标。但是我遇到了问题,List因为 Visual Studio 说无法更改列表项,因为它不是变量。我该如何解决这个问题?

List<Point> vertices = new List<Point>(); //list of vertices
void canvas_MouseUp(object sender, MouseEventArgs e) {
    if (!move) return; //if moving is off returns
    vertices[indexOfMoved].X = e.X; //change X position to new position
    vertices[indexOfMoved].Y = e.Y; //change Y position to new position
    indexOfMovedLabel.Text = "Moved: ?";
}

问题:

错误 1 ​​无法修改 'System.Collections.Generic.List.this[int]' 的返回值,因为它不是变量

4

2 回答 2

7

这是因为它Point是一个结构体而不是一个对象。您可以将结构视为分组值。

因此,当您访问 vertices[indexOfMoved] 时,您会得到列表中内容的副本,而不是实际的“对象”。

你可以这样做:

vertices[indexOfMoved] = new Point { X = e.X, Y = e.Y };
于 2012-05-24T13:36:18.273 回答
2

你不能改变这个值,因为 Point 是一个结构。在给出很多细节之前;您需要将功能更改为以下内容:

private void canvas_MouseUp(object sender, MouseEventArgs e)
{
    if (!move) return; //if moving is off returns
    Point p = vertices[indexOfMoved];
    p.X = e.X;
    p.Y = e.Y;
    vertices[indexOfMoved] = p;            
    indexOfMovedLabel.Text = "Moved: ?";
}

发生这种情况是因为您使用的是结构。如果编译器没有给出任何警告,则将在堆栈中创建一个新结构,并对堆栈中的结构进行更改;这对列表中的结构没有影响。编译器会发出警告以防止这种情况发生。

于 2012-05-24T13:39:59.577 回答