2011-09-27 72 views
8

trong ứng dụng của tôi, tôi có một điều khiển LineShape và một điều khiển tùy chỉnh (về cơ bản là một PictureBox có nhãn).Cách tạo tham chiếu đến cấu trúc trong C#

Tôi muốn LineShape thay đổi một trong các tọa độ điểm của nó, theo vị trí của điều khiển tùy chỉnh.

Tôi đã có ý tưởng đặt tham chiếu đến điểm LineShape bên trong điều khiển tùy chỉnh và thêm trình xử lý sự kiện thay đổi vị trí thay đổi tọa độ điểm được tham chiếu.

Tuy nhiên được xây dựng trong Point là một cấu trúc là một loại giá trị, do đó sẽ không hoạt động. Có ai có ý tưởng, làm thế nào để làm cho một tham chiếu đến một cấu trúc hoặc có thể ai đó biết một workaround cho vấn đề của tôi?

Tôi đã thử giải pháp liên quan đến việc sử dụng loại có thể vô hiệu hóa nhưng vẫn không hoạt động. Dưới đây là cách tôi xác định lĩnh vực này trong điều khiển tùy chỉnh của tôi (DeviceControl):

private Point? mConnectionPoint; 

Và thực hiện của địa điểm thay đổi xử lý sự kiện:

private void DeviceControl_LocationChanged(object sender, EventArgs e) 
{ 
    if (mConnectionPoint != null) 
    { 
     DeviceControl control = (DeviceControl)sender; 

     Point centerPoint= new Point(); 
     centerPoint.X = control.Location.X + control.Width/2; 
     centerPoint.Y = control.Location.Y + control.Height/2; 

     mConnectionPoint = centerPoint; 
    } 
} 

Trả lời

7

Bạn có thể vượt qua các loại giá trị bằng cách tham chiếu bằng cách thêm 'ref' trước khi nó đi qua một phương pháp.

như thế này:

void method(ref MyStruct param) 
{ 
} 
0

phương pháp của bạn không thực sự đòi hỏi 'tham khảo' truy cập vào các thành viên mConnectionPoint; Bạn có thể gán các giá trị vị trí trực tiếp đến điểm tham chiếu, như một thành viên của lớp học của bạn:

private void DeviceControl_LocationChanged(object sender, EventArgs e) 
{ 
    if (mConnectionPoint != null) 
    { 
     DeviceControl control = (DeviceControl)sender; 

     mConnectionPoint.X = control.Location.X + control.Width/2; 
     mConnectionPoint.Y = control.Location.Y + control.Height/2; 
    } 
} 

Tuy nhiên, nếu lý do mã này là để di chuyển sự kiểm soát LineShape, thì bạn nên đi thẳng vào nguồn. Cách tốt nhất để thay đổi các thuộc tính của điều khiển chỉ là thay đổi các thuộc tính trên điều khiển:

DeviceControl control = (DeviceControl)sender; 

    line1.StartPoint = [calculate point1 coordinates]; 
    line1.EndPoint = [calculate point2 coordinates]; 
Các vấn đề liên quan