У меня есть следующие
var leftMouseDown = Observable.FromEvent<MouseButtonEventArgs>(displayCanvas, "MouseLeftButtonDown");
var leftMouseUp = Observable.FromEvent<MouseButtonEventArgs>(displayCanvas, "MouseLeftButtonUp");
var mouseMove = Observable.FromEvent<MouseEventArgs>(displayCanvas, "MouseMove");
var leftMouseDragging = from down in leftMouseDown
let startPoint = down.EventArgs.GetPosition(displayCanvas)
from move in mouseMove.TakeUntil(leftMouseUp)
let endPoint = move.EventArgs.GetPosition(displayCanvas)
select new { Start = startPoint, End = endPoint };
который, когда я подпишусь на него, даст мне начальную точку перетаскивания и текущую конечную точку. Теперь мне нужно что-то сделать, когда перетаскивание закончено. Мне не удалось полностью сделать это с помощью RX, и в итоге я сделал
leftMouseDragging.Subscribe(value=>
{
dragging = true;
//Some other code
});
leftMouseUp.Subscribe(e=>
{
if(dragging)
{
MessageBox.Show("Just finished dragging");
dragging = false;
}
});
Это работает нормально, пока я не перетащу правой кнопкой мыши. Затем, когда я щелкаю левой кнопкой мыши, я получаю окно сообщения. Если я перетаскиваю только левую кнопку, я получаю окно сообщения, а затем щелчок левой кнопкой мыши не приводит к появлению окна. Я бы хотел сделать это без внешнего состояния, но, по крайней мере, я бы хотел, чтобы он работал правильно.
К вашему сведению: я пытался сделать перетаскивание нестабильным и использовать блокировку, но это не сработало.
ИЗМЕНИТЬ
Оказывается, моя проблема была в контекстном меню, вызываемом правой кнопкой мыши. Как только я избавился от этого, мой приведенный выше код заработал. Итак, теперь моя проблема в том, как мне получить контекстное меню и по-прежнему работать мой код. Я предполагаю, что контекстное меню обрабатывало щелчок левой кнопкой мыши, и это почему-то привело к тому, что мой код не работал, но я все еще ломаю голову.