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());
    }