public EventToReactiveProperty2ViewModel() { // 前回と最新のマウス位置の差分を流す MouseMovePoint .Pairwise() .Select(x => (x.NewItem - x.OldItem)) .SkipUntil(MouseDownUnit) .TakeUntil(MouseUpUnit) .Finally(() => DragPoint.Value = default)
private void MouseMoveHandler(object sender, MouseEventArgs e) { Control source = (Control)sender; MouseButtons button = e.Button; int clicks = e.Clicks; int delta = e.Delta; Point location = e.Location; Point point2 = source.PointToScreen(location); int inputMessageTime = UIUtil.GetInputMessageTime(); MouseMovePoint latestMovePoint = new MouseMovePoint(point2.X, point2.Y, inputMessageTime); IList <MouseMovePoint> intermediateScreenPoints = GetIntermediateScreenPoints(this.previousMovePoint, latestMovePoint); IList <PointDouble> intermediatePoints = this.ConvertIntermediateScreenPointsToDocument(source, intermediateScreenPoints); this.previousMovePoint = new MouseMovePoint?(latestMovePoint); this.MouseMoveHandlerImpl(intermediatePoints.Last <PointDouble>(), button, clicks, delta, intermediatePoints); }
private static IList <MouseMovePoint> GetIntermediateScreenPoints(MouseMovePoint?previousMovePoint, MouseMovePoint latestMovePoint) { List <MouseMovePoint> list = new List <MouseMovePoint>(); if (previousMovePoint.HasValue) { IList <MouseMovePoint> collection = UIUtil.TryGetMouseMoveScreenPoints(previousMovePoint.Value, latestMovePoint); if (collection != null) { list.AddRange(collection); } } if (list.Count == 0) { list.Add(latestMovePoint); } return(list); }