Эти сценарии очень сложны для реализации - посмотрите ваши обработчики и логические переменные для хранения состояния.
Я бы предложил использовать Реактивные расширения .
Edit:
Вероятно, он будет немного перегружен (я не знаю, единственный ли это сценарий, который Elfoc хочет реализовать). В Rx вы можете создать наблюдаемую последовательность событий
var mouseDown = Observable.FromEvent<MouseButtonEventArgs>(source, "MouseDown");
var mouseUp = Observable.FromEvent<MouseButtonEventArgs>(image, "MouseUp");
var mouseMove = from evt in Observable.FromEvent<MouseEventArgs>(image, "MouseMove")
select evt.EventArgs.GetPosition(this);
использовать LINQ-to-Rx для запроса и фильтрации событий
var leftMouseDown = from evt in mouseDown
where evt.LeftButton == MouseButtonState.Pressed
select evt;
и составьте его, используя операторы Rx - пока не произойдет событие повышения мыши, занимайте все позиции, пока левая мышь не работает
var q = from position in leftMouseDown
from pos in mouseMove.Until(mouseUp)
select new { X = pos.X - imageOffset.X, Y = pos.Y - imageOffset.Y };
Наконец, подпишитесь на наблюдаемую последовательность позиций и делайте свое дело
q.Subsribe(value => { ... });
Слегка модифицированный код здесь .