我有一个复杂的问题(也许只有简单的答案)。
我有课,包含一些行,点和“标记”。
Marker
是一个包含Ellipse
及其中心坐标(Point
)的类。
Marker
类具有拖放实现,可以移动椭圆并更改Marker.coordinates
属性。这很有效。
但是我想使用我的Marker
类中的拖放来移动SomeShape对象中的点(Marker
对象是SomeShape
的一部分。)
我想,当我创建Marker
对象并将'SomeShape.lineEnds [0]'传递给Marker
构造函数时 - Marker类的更新也会更新我的SomeShape.lineEnds[0]
,但是它不起作用。
我该如何解决这个问题?通过某种方式使用一些参考?
我希望我能够清楚地描述我的问题。
代码:
class SomeShape
{
// this object is set of lines and "Markers" (class below)
private List<Marker> markers;
private List<Point> lineEnds;
private List<Line> lines;
// my object can redraw itself on canvas
public RedrawMe()
{
// it removes own lines from canvas and it puts new lines
// I call this function after I add points to lineEnds collection etc.
// or when I change coordinates on one of lineEnds (list of points)
}
public void AddPoint(Point p)
{
this.lineEnds.Add(p); // adding point to line ends
this.markers.Add(new Marker(p, this, c)); // adding same point to new marker
RedrawMe();
}
}
有问题的部分:
class Marker
{
public Canvas canvas;
private Ellipse e;
private Point coordinates; // ellipse center coordinates
private Object parent; // I store SomeShape object here to call RedrawMe method on it
public Marker(Point p, Object par, Canvas c)
{
this.coordinates = p;
this.canvas = c;
this.parent = par;
e = MyClassFactory.EllipseForMarker();
e.MouseDown += new System.Windows.Input.MouseButtonEventHandler(e_MouseDown);
e.MouseMove += new System.Windows.Input.MouseEventHandler(e_MouseMove);
e.MouseUp += new System.Windows.Input.MouseButtonEventHandler(e_MouseUp);
c.Children.Add(e);
e.Margin = new Thickness(p.X - (e.Width/2), p.Y - (e.Height/2), 0, 0);
}
public void MoveIt(Point nc) // nc - new coordinates
{
this.e.Margin = new Thickness(nc.X - (e.Width / 2), nc.Y - (e.Height / 2), 0, 0);
this.coordinates.X = nc.X;
this.coordinates.Y = nc.Y;
if (this.parent is SomeShape) ((SomeShape)parent).RedrawMe();
}
#region DragDrop // just drag drop implementation, skip this
private bool is_dragged = false;
void e_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e){
e.Handled = true;
is_dragged = false;
this.e.ReleaseMouseCapture();
}
void e_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) {
if (is_dragged)
{
this.MoveIt(e.GetPosition(canvas));
}
}
void e_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
is_dragged = true;
this.e.CaptureMouse();
}
#endregion // DragDrop
}
答案 0 :(得分:0)
至于你的问题,你想“通知”父母,虽然有很多方法可以解决这个问题,但经典的C#方式是创建一个事件并在需要时触发它。
另一方面,您拥有构造函数中的父级。我认为你应该考虑接收一个类似IDrawable
的接口,它将包含你想从父进程调用的任何方法,并通过它通知父对象它可以重绘。
在拖放中我没有看到任何通知父母的代码,因此无法发表评论。但为什么不激活同一个((SomeShape)parent).RedrawMe()
的呼叫?
答案 1 :(得分:0)
Point是一个结构,而不是类,它不会像这样工作。
我假设,因为结构不是“引用类型”。
我创建了自己的“MyPoint”类,它具有X和Y属性,并且有效。