向MouseLeave Storyboard添加延迟

时间:2014-02-18 10:50:37

标签: c# wpf storyboard delay mouseleave

我有一个故事板在为特定控件触发MouseLeave时播放动画。

我想在触发MouseLeave后引入500毫秒的延迟,并检查鼠标是否不再超过控件。然后才能播放控件。如果用户在500毫秒内将鼠标悬停在控件上,则无需播放故事板动画。怎么做到这一点?

2 个答案:

答案 0 :(得分:2)

实现您要求的代码

private void UIElement_OnMouseLeave(object sender, MouseEventArgs e)
{
    var uiElement = sender as UIElement;
    uiElement.MouseLeave -= UIElement_OnMouseLeave;

    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000); // or 500ms
        Dispatcher.Invoke(() =>
        {
            if (!uiElement.IsMouseOver)
            {
                // Animation Code Goes Here;
            }
            uiElement.MouseLeave += UIElement_OnMouseLeave;
        });
    });
}

OR 对Tarec的需求

private readonly DispatcherTimer _dispatcherTimer = new DispatcherTimer
{
    Interval = new TimeSpan(0,0,0,0,1000),
};

_dispatcherTimer.Tick += (sender, args) =>
{
    _dispatcherTimer.Stop();
    if (!uIElement.IsMouseOver)
    {
        // Animation Code Goes Here;
    }
};

private void UIElement_OnMouseLeave(object sender, MouseEventArgs e)
{
    // Reset Timer if Mouse Leave
    _dispatcherTimer.Stop();
    _dispatcherTimer.Start();
}

答案 1 :(得分:0)

设置标记bool isMouseOver = true。在MouseLeave上设置一个标记为false,并在MouseEnter上设置为true。创建一个方法,如果isMouseOver == false触发动画,并将其附加到延迟500ms的计时器。计时器本身应在MouseLeave事件中启动/重置,并在MouseEnter停止。

编辑: 当然,如果可用,您应该使用IsMouseOver属性而不是自定义标志。