private IObservable<SW.DragDropKeyStates> GetKeyStatesChanged() { return Observable.Merge( // before drag starts listen only root visual from _ in Observable.Merge(Observable.Return(new Unit()), _itemDragCompleted.IgnoreAll()) from keyStates in Observable .Return(Application.Current) .ObserveOnDispatcher() .SelectMany(app => app.RootVisual.GetKeyStateChangedAlways(_keyStates)) .TakeUntil(_itemDragStarted) select keyStates, // after drag starts listen to root visual and all siblings from _ in _itemDragStarted from keyStates in Observable .Return(Application.Current) .ObserveOnDispatcher() .SelectMany(app => app.RootVisual.GetKeyStateChangedOnSelfAndSiblingsAlways(_keyStates)) .TakeUntil(_itemDragCompleted) select keyStates); } 主要是 from _ in 里面的 _ |