private void OnUIElementManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs args)
        {
            double translationX = args.Cumulative.Translation.X - m_lastCapturedPoint.X;
            double translationY = args.Cumulative.Translation.Y - m_lastCapturedPoint.Y;

            if ((Math.Abs(translationX) > RECOGNIZE_DISTANCE) ||
                (Math.Abs(translationY) > RECOGNIZE_DISTANCE))
            {
                //Handle the case when one coordinat is zero
                if (translationX == 0f)
                {
                    if (translationY < 0f)
                    {
                        MoveTop.Raise(this, EventArgs.Empty);
                    }
                    else if (CanRaiseEvent())
                    {
                        MoveDown.Raise(this, EventArgs.Empty);
                        m_lastEventTimestamp = DateTime.UtcNow;
                    }

                    m_lastCapturedPoint = args.Cumulative.Translation;
                    return;
                }
                else if (translationY == 0f)
                {
                    if (translationX < 0f)
                    {
                        MoveLeft.Raise(this, EventArgs.Empty);
                    }
                    else if (CanRaiseEvent())
                    {
                        MoveRight.Raise(this, EventArgs.Empty);
                        m_lastEventTimestamp = DateTime.UtcNow;
                    }

                    m_lastCapturedPoint = args.Cumulative.Translation;
                    return;
                }

                //Handling logic for standard case
                float xToY = (float)translationX / (float)translationY;
                float yToX = (float)translationY / (float)translationX;
                if (Math.Abs(xToY) < 0.4f)
                {
                    if (translationY < 0f)
                    {
                        MoveTop.Raise(this, EventArgs.Empty);
                    }
                    else if (CanRaiseEvent())
                    {
                        MoveDown.Raise(this, EventArgs.Empty);
                        m_lastEventTimestamp = DateTime.UtcNow;
                    }

                    m_lastCapturedPoint = args.Cumulative.Translation;
                    return;
                }
                else if (Math.Abs(yToX) < 0.4f)
                {
                    if (translationX < 0f)
                    {
                        MoveLeft.Raise(this, EventArgs.Empty);
                    }
                    else if (CanRaiseEvent())
                    {
                        MoveRight.Raise(this, EventArgs.Empty);
                        m_lastEventTimestamp = DateTime.UtcNow;
                    }

                    m_lastCapturedPoint = args.Cumulative.Translation;
                    return;
                }
            }
        }