public static Tuple <Shape, string> FindShapeAtPoint(this Canvas Canvas, Point Pos)
        {
            Shape  found      = null;
            var    posRect    = Pos.GetRectAtPoint();
            string comboDebug = null;

            foreach (var elem in Canvas.Children)
            {
                var uiShape = elem as Shape;
                if (uiShape != null)
                {
                    if (uiShape is Line)
                    {
                        var uiLine = uiShape as Line;
                        if (uiLine.IntersectsWith(Pos))
                        {
                            found = uiShape;
                            break;
                        }
                    }

                    else if (uiShape is Path)
                    {
                        var uiPath = uiShape as Path;

                        var rectGeom = new RectangleGeometry();
                        rectGeom.Rect = new Rect(Pos, new Size(1, 1));
                        var rp = new Path();
                        rp.Fill            = Brushes.Black;
                        rp.Stroke          = Brushes.Black;
                        rp.StrokeThickness = 1;
                        rp.Data            = rectGeom;

                        var xx = uiPath.RenderedGeometry.FillContainsWithDetail(rectGeom);
                        if (xx == IntersectionDetail.Intersects)
                        {
                            found = uiShape;
                            break;
                        }
                    }

                    else
                    {
                        var rect = CanvasExt.GetShapeRect(uiShape);
                        if (rect.IntersectsWith(posRect))
                        {
                            found = uiShape;
                            break;
                        }
                    }
                }
            }

            return(new Tuple <Shape, string>(found, comboDebug));
        }
        /// <summary>
        /// Find the first shape on the canvas at the point. If no shape found, look for
        /// shapes that are between the PriorPos and the Pos. Shapes between the two
        /// positions are passed over shapes. Return the estimated pass over point.
        /// </summary>
        /// <param name="Canvas"></param>
        /// <param name="Pos"></param>
        /// <param name="PriorPos"></param>
        /// <returns></returns>
        public static Tuple <Shape, Point?> FindShapeAtPoint(
            this Canvas Canvas, Point Pos, Point?PriorPos)
        {
            Shape found            = null;
            Point?estPassOverPoint = null;
            var   posRect          = Pos.GetRectAtPoint();

            foreach (var elem in Canvas.Children)
            {
                var uiShape = elem as Shape;
                if (uiShape != null)
                {
                    if (uiShape is Line)
                    {
                        var uiLine = uiShape as Line;
                        if (uiLine.IntersectsWith(Pos))
                        {
                            found = uiShape;
                            break;
                        }
                    }

                    else
                    {
                        var rect = CanvasExt.GetShapeRect(uiShape);
                        if (rect.IntersectsWith(posRect))
                        {
                            found = uiShape;
                            break;
                        }
                    }
                }
            }

            return(new Tuple <Shape, Point?>(found, estPassOverPoint));
        }