Вставленный ответ cplotts хорош, но может не применяться в вашем случае, поскольку он оставляет анимацию привязанной к свойству IsOpen, эффективно блокируя ее на месте и предотвращая ее изменение с помощью прямой установки свойства, привязки и других способов. Это может затруднить использование вашего кода в зависимости от того, как вы его используете.
Если это так, я бы переключился на запуск DispatcherTimer, когда вы хотите открыть всплывающее окно после некоторой задержки, например:
_popupTimer = new DispatcherTimer(DispatcherPriority.Normal);
_popupTimer.Interval = TimeSpan.FromMilliseconds(100);
_popupTimer.Tick += (obj, e) =>
{
_popup.IsOpen = true;
};
_popupTimer.Start();
Для поведения, подобного всплывающей подсказке, это можно сделать в MouseEnter. Если вы хотите отменить открытие всплывающего окна по какой-либо причине (например, если мышь покидает элемент управления до появления всплывающего окна), просто:
_popupTimer.Stop();
Обновление
Как отмечено в комментарии cplotts, вы также захотите установить _popup.IsOpen = false
в некоторых ситуациях в событии MouseLeave, в зависимости от вашей логики обработки событий входа / выхода мыши между вашим элементом управления и всплывающим окном. Имейте в виду, что обычно вы не хотите вслепую устанавливать IsOpen=false
для каждого события MouseLeave, потому что это может быть сделано, когда над ним появляется всплывающее окно. В некоторых ситуациях это может привести к вспыхивающему всплывающему окну. Так что вам понадобится немного логики.