internal void DrawHandle(CanvasDrawingSession win2d, DrawingPoint befor, bool atlast)
        {
            if (atlast && befor != null)
            {
                if (befor.IsHaveControlPoint)
                {
                    var cp = befor.getControlPoint(false);
                    var pt = befor.getPoint();
                    win2d.DrawLine(pt, cp, Colors.Green);
                    DrawHandle_sub(win2d, cp.X, cp.Y, true, Colors.Green);
                }
            }
            if (_haveControlPoint)
            {
                DrawHandle_sub(win2d, _point.X, _point.Y, true, Colors.Blue);
                if (atlast)
                {
                    var x = _point.X - (_controlPoint0.X - _point.X);
                    var y = _point.Y - (_controlPoint0.Y - _point.Y);

                    win2d.DrawLine(new Vector2(x, y), _controlPoint0, Colors.Green);

                    DrawHandle_sub(win2d, x, y, true, Colors.Green);
                }
                DrawHandle_sub(win2d, _controlPoint0.X, _controlPoint0.Y, true, Colors.Green);
            }
            else
            {
                DrawHandle_sub(win2d, _point.X, _point.Y, false, Colors.Blue);
            }
        }
 internal void Reset()
 {
     if (_points != null)
     {
         _points.Clear();
     }
     statePress = false;
     movePoint  = null;
     pressPoint = null;
     _mainPage.EditCanvasInvalidate();
 }
 void MakePath(ref CanvasPathBuilder path, DrawingPoint befor, DrawingPoint target)
 {
     if (befor.IsHaveControlPoint || target.IsHaveControlPoint)
     {
         //                    canvasPathBuilder.AddLine(200, 200);
         //                    canvasPathBuilder.AddCubicBezier(new Vector2(250, 300), new Vector2(250, 300), new Vector2(300, 200));
         Vector2 controlpoint1 = befor.getControlPoint(false);
         Vector2 controlpoint2 = target.getControlPoint(true);
         path.AddCubicBezier(controlpoint1, controlpoint2, target.getPoint());
     }
     else
     {
         path.AddLine(target.getPoint());
     }
 }
        internal void Draw(CanvasDrawingSession ds, ViewInfo viewInfo)
        {
            //            var dt = DateTime.Now;
            //            System.Diagnostics.Debug.WriteLine(string.Format("Draw:time:{0}",dt.ToString("mm:ss:fff")));
            //            if (_points != null && _points.Count > 0)
            if (_points != null && _points.Count > 0)
            {
                ds.Transform = new Matrix3x2(1, 0, 0, 1, viewInfo.OffsetX, viewInfo.OffsetY);
                if (_points.Count > 1 || !statePress)
                {
                    var canvasPathBuilder = new Microsoft.Graphics.Canvas.Geometry.CanvasPathBuilder(ds);

                    int          index = 0;
                    DrawingPoint befor = _points[index];
                    DrawingPoint tp    = null;
                    index++;
                    canvasPathBuilder.BeginFigure(befor.getPoint());
                    for (; index < _points.Count; index++)
                    {
                        tp = _points[index];
                        MakePath(ref canvasPathBuilder, befor, tp);
                        befor = tp;
                        tp    = null;
                    }

                    canvasPathBuilder.EndFigure(CanvasFigureLoop.Open);

                    ds.DrawGeometry(CanvasGeometry.CreatePath(canvasPathBuilder), Colors.HotPink, 1);
                }

                {
                    DrawingPoint befor = null;
                    DrawingPoint tp    = null;

                    for (int index = 0; index < _points.Count; index++)
                    {
                        tp = _points[index];
                        tp.DrawHandle(ds, befor, index == _points.Count - 1);
                        befor = tp;
                    }
                }
            }
        }
        /// <summary>
        /// マウスイベント
        /// </summary>
        /// <param name="kind"></param>
        /// <param name="pos"></param>
        internal void PointerEvent(MouseEventKind kind, Vector2 pos)
        {
            if (_points == null)
            {
                _points = new List <DrawingPoint>();
            }
            pos = snapPos(pos);
            switch (kind)
            {
            case MouseEventKind.Press:
            {
                _mainPage.FocusMove();

                statePress = true;
                System.Diagnostics.Debug.WriteLine("Event:Press");
                if (movePoint != null)
                {
                    pressPoint = movePoint;
                    movePoint  = null;
                }
                else
                {
                    pressPoint = new DrawingPoint(pos);
                    _points.Add(pressPoint);
                }
                currentPoint = pos;
                Invalidate();
            }
            break;

            case MouseEventKind.Move:
                if (_points.Count > 0)
                {
                    if (pos != currentPoint)
                    {
                        currentPoint = pos;
                        if (pressPoint != null)
                        {
                            pressPoint.UpdateKind(pos);
                        }
                        else
                        {
                            if (movePoint == null)
                            {
                                movePoint = new DrawingPoint(pos);
                                _points.Add(movePoint);
                            }
                            movePoint.SetPos(pos);
                        }
                        Invalidate();
                    }
                }
                break;

            case MouseEventKind.Release:
                System.Diagnostics.Debug.WriteLine("Event:Release");
                if (statePress)
                {
                    statePress = false;
                    pressPoint = null;
                    if (_points != null && _points.Count >= 3)
                    {
                        var p0 = _points[0].getPoint();
                        var p1 = _points[_points.Count - 1].getPoint();
                        if (p0 == p1)
                        {
                            _mainPage.CreatePath(_points, true);
                            CancelEvent();
                        }
                    }
                    Invalidate();
                }
                break;

            case MouseEventKind.Double:
                if (_points.Count > 2)
                {
                    _points.RemoveAt(_points.Count - 1);
                    _mainPage.CreatePath(_points, false);
                }
                CancelEvent();    // _poits 等もクリア
                break;
            }
        }