0

私は複雑な問題を抱えています(おそらく簡単な答えで)。

いくつかの線、点、および「マーカー」を含むクラスがあります。

MarkerEllipseとその中心座標 ( )を含むクラスです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
}
4

2 に答える 2