private static IObservable <bool> GetIsAdornerVisible(InputElement associatedObject, InputElement adorner) { var isPointerOverAdorner = adorner.GetObservable(InputElement.IsPointerOverProperty); var isPointerOverAssociatedObject = associatedObject.GetObservable(InputElement.IsPointerOverProperty); var delay = TimeSpan.FromSeconds(0.05); var overAssociated = isPointerOverAssociatedObject.DelayFalse(delay); var overAdorner = isPointerOverAdorner.DelayFalse(delay); return(overAssociated .CombineLatest(overAdorner, (isOverAssociated, isOverAdorner) => isOverAssociated || isOverAdorner) .DistinctUntilChanged()); }