Я хочу отслеживать направление движения мыши (влево / вправо / вверх / вниз / диагональ) в 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;
}