在我的主窗口中,我有一个有三行的网格。第一行是带有我的应用程序名称的标题,第二行包含一个带有错误消息部分的文本块,第三行包含另一个带有文本框和登录按钮的网格。
我的问题在于第二行。我想要做的是当字符串更改值时,使用滑动动画显示文本块。我不确定谁会读到这个,但价值存在于服务中。服务只是一个包含可在视图之间共享的属性的类。这很重要的原因是因为我在主窗口中放置了一些用户控件。我不能简单地发布消息'在主窗口的视图模型中的属性,因为我不会永远在那里。 '消息'我需要向用户显示该服务,以便无论我在哪个视图中,我都可以设置'消息'属性并向用户显示错误。
下面是我的代码,可以毫无问题地动画文本块。
<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">
目前发生的情况是主窗口加载时,会发生滑动动画。这并没有真正帮助我,因为我需要这个动画发生可变次数,即当用户点击错误按钮,当他们输入无效输入等时。我需要以某种方式创建自定义路由事件。我调查了这些,但我无法让他们工作。我想有一种方法可以创建这个自定义路由事件,以便在数据服务中的值发生更改时引发。我已经看了几天,但似乎无法让这个自定义路由事件正常工作。这似乎是正确的方法,但如果有不同的路线,任何建议都会很棒。如果没有,任何有关自定义路由事件的帮助也会很棒。
答案 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>