0

我正在开发触摸屏应用程序。这个应用程序是针对某个行业的,但一般的理想就是解释问题所需要的。首先,我在 WPF 上进行速成课程,并允许用户添加一个新命令(形状 - 矩形),然后为其分配功能。例如,他们可以添加一个,然后添加第二个,然后添加第三个,依此类推,将它们定位在他们想要的位置。

我想知道的是如何在惯性发生时告诉 API 并说用户触摸一个形状然后将其扔过屏幕,以便事件不仅在到达屏幕边缘时完成(已经这样做了) ,但如果它相交或撞到另一个形状。以下是快速基本概念证明的通用代码。

void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        try
        {
            // Get the Rectangle and its RenderTransform matrix.
            Rectangle rectToMove = e.OriginalSource as Rectangle;

            Matrix rectsMatrix = ((MatrixTransform)rectToMove.RenderTransform).Matrix;

            // Rotate the Rectangle.
            rectsMatrix.RotateAt(e.DeltaManipulation.Rotation,
                                 e.ManipulationOrigin.X,
                                 e.ManipulationOrigin.Y);

            // Resize the Rectangle.  Keep it square 
            // so use only the X value of Scale.
            rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X,
                                e.DeltaManipulation.Scale.X,
                                e.ManipulationOrigin.X,
                                e.ManipulationOrigin.Y);

            // Move the Rectangle.
            rectsMatrix.Translate(e.DeltaManipulation.Translation.X,
                                  e.DeltaManipulation.Translation.Y);

            // Apply the changes to the Rectangle.
            rectToMove.RenderTransform = new MatrixTransform(rectsMatrix);

            Rect containingRect =
                new Rect(((FrameworkElement)e.ManipulationContainer).RenderSize);

            Rect shapeBounds =
                rectToMove.RenderTransform.TransformBounds(
                    new Rect(rectToMove.RenderSize));

            // Check if the rectangle is completely in the window.
            // If it is not and intertia is occuring, stop the manipulation.
            if (e.IsInertial && !containingRect.Contains(shapeBounds))
            {
                e.Complete();
            }

            if (e.IsInertial)
            {
                //convert current moving rect to new rect drawing type
                var tempRect = new Rect(Canvas.GetLeft(rectToMove), Canvas.GetTop(rectToMove), rectToMove.Width, rectToMove.Height);
                //we need to convert SytsemWindows.Shapes.Rectablge to SystemWindows.Drawing.Rect first
                //List<System.Windows.Shapes.Rectangle> removeCurrent = Commands.Where(r => r != rectToMove).ToList();
                //List<System.Windows.Rect> coordinates = Commands.Where(r => r.Name != rectToMove.Name).Select(r => new Rect(Canvas.GetLeft(r), Canvas.GetTop(r), r.Width, r.Height)).ToList();

                List<System.Windows.Rect> recs = new List<Rect>();

                List<Rectangle> test = Commands.Where(r => r.Name != rectToMove.Name).ToList();

                foreach (System.Windows.Shapes.Rectangle re in test)
                {
                    if (re != rectToMove)
                    {
                        recs.Add(new Rect(Canvas.GetLeft(re), Canvas.GetTop(re), re.Width, re.Height));
                    }
                }

                //if rect item is in motion inertia and it intersects with any of pre made command rects, then stop.
                if (recs.Any(c => c.InteriorIntersectsWith(tempRect)))
                {
                    //There is overlapping
                    e.Complete();
                }

            }

        }
        catch(Exception ex)
        {

        }

        e.Handled = true;
    }

问题是惯性工作正常。一旦第二个形状被添加到画布上,惯性就不再起作用了。用户可以单击并拖动它们,但是当试图轻弹形状时,它们会立即停止,就好像它从所有位置报告它正在与另一个形状相交,即使它们彼此不靠近。关于我做错了什么的任何想法?用户添加一个或多个项目后的示例,触摸拖动和甩动中断

4

0 回答 0