【问题标题】:Begin storyboard animation when value receives update当值收到更新时开始故事板动画
【发布时间】:2017-11-20 23:12:42
【问题描述】:

在我的主窗口中,我有一个包含三行的网格。第一行是我的应用程序名称的标题,第二行包含一个带有错误消息部分的文本块,第三行包含另一个带有文本框和登录按钮的网格。

我的问题在第二行。我想要做的是在字符串更改值时显示带有滑动动画的文本块。我不确定谁会阅读这篇文章,但价值存在于服务中。服务只是一个包含您可以在视图之间共享的属性的类。这很重要的原因是因为我在主窗口中放置了一些用户控件。我不能简单地将“消息”属性放在主窗口的视图模型中,因为我不会一直在那里。我需要向用户显示的“消息”进入服务,这样无论我在哪个视图中,我都可以设置“消息”属性并向用户显示错误。

下面是我的代码,它可以毫无问题地为文本块设置动画。

<Window.Resources>
    <!--Story board animation that slides down in .5 seconds, displays for 5.5 seconds and then retracts.-->
    <Storyboard x:Key="MessageSlide" AutoReverse="True">
        <DoubleAnimationUsingKeyFrames Duration="0:0:5.5"  Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="textBlock">
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="50"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>
<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded"><!--RoutedEvent="FrameworkElement.Loaded"   t:MessageHandler.CustomTest-->
        <BeginStoryboard Storyboard="{StaticResource MessageSlide}"/>
    </EventTrigger>
</Window.Triggers>

<TextBlock x:Name="textBlock" Grid.Row="1" Background="{Binding Path=DataService.BackgroundColor}" FontSize="32" Foreground="White" Height="0" HorizontalAlignment="Stretch" Margin="0" Text="{Binding Path=DataService.Message, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Center" VerticalAlignment="Stretch" />  

我需要在“EventTrigger”的“RoutedEvent”中完成。

<EventTrigger RoutedEvent="FrameworkElement.Loaded">

目前发生的是当主窗口加载时,会发生滑动动画。这并没有真正帮助我,因为我需要这个动画发生可变的次数,即当用户点击错误的按钮时,当他们输入无效的输入等时。我需要以某种方式创建一个自定义路由事件。我已经研究过这些,但我一直无法让它们工作。我想有一种方法可以创建此自定义路由事件以在数据服务中的值更改时引发。我已经看了几天了,但似乎无法让这个自定义路由事件正常工作。这似乎是正确的方法,但如果有不同的路线,任何建议都会很棒。如果没有,对自定义路由事件的任何帮助也会很棒。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    由于某种原因 AutoReverse 在这里对我不起作用,但以下 Binding.TargetUpdated 事件触发器也应该这样做:

    <TextBlock Text="{Binding DataService.Message, NotifyOnTargetUpdated=True}" ...>
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Height">
                            <EasingDoubleKeyFrame Value="50" KeyTime="0:0:0.5"/>
                            <DiscreteDoubleKeyFrame Value="50" KeyTime="0:0:10.5"/>
                            <EasingDoubleKeyFrame Value="0" KeyTime="0:0:11"/>
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>
    

    【讨论】:

    • 谢谢,与我尝试做的相比,这非常有用且非常干净。我在 msdn 上看到自定义事件可用,所以我从那里开始。我没有在文档中看到 TargetUpdated 可用。
    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 2011-03-11
    • 2012-01-11
    • 1970-01-01
    • 2012-02-21
    • 2021-05-05
    • 2020-05-19
    相关资源
    最近更新 更多