0

私はタッチスクリーンアプリに取り組んでいます。このアプリは特定の業界向けですが、問題を説明するために必要なのは一般的な理想だけです。開始するには、WPF でクラッシュ コースを実行し、ユーザーが新しいコマンド (Shape - Rectangle) を追加できるようにしてから、それに関数を割り当てます。たとえば、1 つ追加し、次に 2 つ目を追加し、次に 3 つ目を追加するなど、必要な場所に配置することができます。

私が知りたいのは、慣性が発生しているときに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;
    }

問題は、慣性が正常に機能することです。2 つ目のシェイプがキャンバスに追加されると、慣性は機能しなくなります。ユーザーはそれらをクリックしてドラッグできますが、形状をフリックしようとすると、互いに近くにない場合でも、別の形状と交差していることをすべての位置から報告するかのように、即座に停止します。私が間違っていることについてのアイデアはありますか?ユーザーが 1 つ以上のアイテムを追加した後の例、タッチ ドラッグとフリングが壊れる

4

0 に答える 0