Как получить направление движения мыши в WPF (C #) - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу отслеживать направление движения мыши (влево / вправо / вверх / вниз / диагональ) в WPF.Я видел этот ответ на stackoverflow , но он не работал для меня.Итак, я написал некоторый код, как показано ниже. Вот как работает моя логика. Во-первых, я получаю предыдущее положение мыши каждый раз, когда мышь перемещается по окну И правая кнопка не удерживается.Когда правая кнопка удерживается и мышь движется, я получаю текущую позицию и передаю текущую и предыдущую позиции в GEtMouseDirection (), которая возвращает направление.Проблема в том, что метод возвращает направление как «НЕТ» 7/10 времени.Но в остальных 3/10 случаев это дает правильное направление, так что я думаю, что событие перемещения мыши вызывается так часто, что и currentPosition, и previousPosition почти всегда ОДНОВРЕМЕННЫ.Я не хочу, чтобы это произошло, потому что мне нужно, чтобы это было точным.

Также стоит отметить, что я пытался обрабатывать события перемещения мыши для ImageControl и Border. Но я возвращаю тот же результат. Поэтому я уверен, чтоПроблема не в том, где я хочу обрабатывать событие перемещения мыши.

var pTx = imageControl.TransformToAncestor (imageBorder) .Transform (new System.Windows.Point (0, 0));

Теперь, когда я выяснил причину, по которой я хочу получить точное направление движения мыши, я работаю над средством просмотра изображений и хочу ограничить панорамирование, когда, например, изображение увеличено, мышь движется в направлении ВПРАВО, а ЛЕВО изображения ужевыровнен по левому краю границы, содержащей мое изображение. (то есть, когда pTx.X> = 0. У кого-нибудь есть лучшее решение о том, какполучить направление движения мыши или как ограничить панорамирование, когда изображение уже выровнено?

(«pre» для предыдущей позиции мыши, «cur» для текущей позиции).

    public static MouseDirection GetMouseDirection(Point pre, Point cur)
    {
        // Mouse moved up
        if ((pre.X == cur.X) && (pre.Y > cur.Y))
            return MouseDirection.Up;

        // Mouse moved down
        if ((pre.X == cur.X) && (pre.Y < cur.Y))
            return MouseDirection.Down;

        // Mouse moved left
        if ((pre.X > cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Left;

        // Mouse moved right
        if ((pre.X < cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Right;

        // Mouse moved diagonally up-right
        if ((pre.X < cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopRight;
        //return MouseDirection.Up;

        // Mouse moved diagonally up-left
        if ((pre.X > cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopLeft;
        //return MouseDirection.Up;

        // Mouse moved diagonally down-right
        if ((pre.X < cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomRight;
        //return MouseDirection.Down;

        // Mouse moved diagonally down-left
        if ((pre.X > cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomLeft;
        //return MouseDirection.Down;

        // Mouse didn't move
        return MouseDirection.None;
    }

1 Ответ

0 голосов
/ 16 февраля 2019

Я исправил свое решение.Ниже приведен мой код

Перечисление направления мыши

public enum MouseDirection
{
    None,
    Up,
    Down,
    Left,
    Right,
    TopLeft,
    TopRight,
    BottomLeft,
    BottomRight,
}

Метод расчета направления мыши

    public static MouseDirection GetMouseDirection(Point pre, Point cur)
    {
        // Mouse moved up
        if ((pre.X == cur.X) && (pre.Y > cur.Y))
            return MouseDirection.Up;

        // Mouse moved down
        if ((pre.X == cur.X) && (pre.Y < cur.Y))
            return MouseDirection.Down;

        // Mouse moved left
        if ((pre.X > cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Left;

        // Mouse moved right
        if ((pre.X < cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Right;

        // Mouse moved diagonally up-right
        if ((pre.X < cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopRight;
        //return MouseDirection.Up;

        // Mouse moved diagonally up-left
        if ((pre.X > cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopLeft;
        //return MouseDirection.Up;

        // Mouse moved diagonally down-right
        if ((pre.X < cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomRight;
        //return MouseDirection.Down;

        // Mouse moved diagonally down-left
        if ((pre.X > cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomLeft;
        //return MouseDirection.Down;

        // Mouse didn't move
        return MouseDirection.None;
    }

обработчик события перемещения мыши и свойства

    static System.Windows.Point pre = new System.Windows.Point();
    static System.Windows.Point cur = new System.Windows.Point();

    private void Panel2_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            cur = e.GetPosition(panel2);

            bool mouseMoved = (pre != cur);

            if (mouseMoved)
                direction = MouseMovement.GetMouseDirection(pre, cur);

            pre = cur;
        }
        else
            pre = e.GetPosition(panel2);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...