C# 如何仅在鼠标长时间悬停时触发wpf动画?

C# 如何仅在鼠标长时间悬停时触发wpf动画?,c#,.net,wpf,wpf-animation,C#,.net,Wpf,Wpf Animation,我是WPF动画新手 我有一个wpf应用程序,有4个按钮。这4个按钮具有动画,其中按钮的不透明度从0.0更改为1.0,当鼠标悬停在该按钮上时会触发该动画 我面临的问题是,即使鼠标在其他按钮上滑动了几分之一秒,这些按钮的动画也会被触发 如果鼠标停留在按钮上至少一秒钟,有没有办法触发动画 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="2*"/> <Col

我是WPF动画新手

我有一个wpf应用程序,有4个按钮。这4个按钮具有动画,其中按钮的不透明度从0.0更改为1.0,当鼠标悬停在该按钮上时会触发该动画

我面临的问题是,即使鼠标在其他按钮上滑动了几分之一秒,这些按钮的动画也会被触发

如果鼠标停留在按钮上至少一秒钟,有没有办法触发动画

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="22.5*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="22.5*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="22.5*"/>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="22.5*"/>
        <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>
    <Button x:Name="Button1" Grid.Column="1" Content="Button 1">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation From="0.0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Button1" Duration="0:0:1"></DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    <Button x:Name="Button2" Grid.Column="3" Content="Button2">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation From="0.0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Button2" Duration="0:0:1"></DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    <Button x:Name="Button3" Grid.Column="5" Content="Button 3">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation From="0.0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Button3" Duration="0:0:1"></DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>

    <Button x:Name="Button4" Grid.Column="7" Content="Button 4">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation From="0.0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Button4" Duration="0:0:1"></DoubleAnimation>
                    </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
    </Button>
    </Grid>


提前感谢

我认为在XAML中这是无法做到的。在代码中,它看起来像这样:

XAML


使用
BeginTime
属性并进行相应设置

            <EventTrigger RoutedEvent="ButtonBase.MouseEnter">
                <BeginStoryboard x:Name="Sb">
                    <Storyboard>
                        <DoubleAnimation 
                               From="0" 
                               To="1" 
                               BeginTime="00:00:5"
                               Duration="00:00:5"                                   
                               Storyboard.TargetProperty="Opacity"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="ButtonBase.MouseLeave">
                <StopStoryboard BeginStoryboardName="Sb"/>
            </EventTrigger>

添加“开始时间”只会延迟动画的开始。问题中解释的场景是,只有当鼠标悬停或停留在某个元素上超过一秒钟时,动画才应该开始。您的解决方案只会延迟动画,但仍会完成动画,不会提供所需的效果@核心解决方案对我来说是可行的。@Tejus两种解决方案的作用是相同的。更清楚地告诉我为什么我的解决方案不好。我在发帖前测试了所有东西。要测试我的解决方案,请执行以下操作1。按住鼠标5秒钟,然后查看效果,2。然后,在5秒钟之前移除鼠标,以查看是否没有动画发生。
public partial class MainWindow : Window
    {
        private DispatcherTimer timer;
        private DoubleAnimation animation;
        private Storyboard sb;

        public MainWindow()
        {
            InitializeComponent();

            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += timer_Tick;

            MyButton.MouseEnter += (sender, e) =>
                {
                    timer.Start();
                };

            MyButton.MouseLeave += (sender, e) =>
                {
                    timer.Stop();
                };

            animation = new DoubleAnimation();
            animation.From = 1;
            animation.To = 0;
            animation.Duration = new Duration(TimeSpan.FromMilliseconds(1000));

            Storyboard.SetTarget(animation, MyButton);
            Storyboard.SetTargetProperty( animation, new PropertyPath(OpacityProperty));

            sb = new Storyboard();
            sb.Children.Add(animation);
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            timer.Stop();
            sb.Begin();
        }
    }
            <EventTrigger RoutedEvent="ButtonBase.MouseEnter">
                <BeginStoryboard x:Name="Sb">
                    <Storyboard>
                        <DoubleAnimation 
                               From="0" 
                               To="1" 
                               BeginTime="00:00:5"
                               Duration="00:00:5"                                   
                               Storyboard.TargetProperty="Opacity"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="ButtonBase.MouseLeave">
                <StopStoryboard BeginStoryboardName="Sb"/>
            </EventTrigger>