值接收更新时开始故事板动画

时间:2017-11-20 14:16:57

标签: wpf

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

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

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

<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" />  

我需要完成的事情在于RoutedEvent&#39; &#39; EventTrigger。&#39;

<EventTrigger RoutedEvent="FrameworkElement.Loaded">

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

1 个答案:

答案 0 :(得分: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>