在TextBlock Visibility.Visible上触发故事板

时间:2018-02-06 21:08:17

标签: wpf xaml

我是WPF和XAML的新品牌,所以如果这是一个愚蠢的问题,我很抱歉:

我正在尝试在TextBlock上启动一个更改文本的StoryBoard。我希望在TextBlock可见时启动此动画。看起来你可以在TextBlock.Triggers括号内触发的唯一事件是EventTrigger。如果是这样的话,据我所知,EventTrigger需要一个路由事件,但IsVisibilityChanged不是一个。既然我不能使用它,那么我应该做些什么呢?

我附上了我的代码示例,它不起作用(不编译),只是为了说明我要做的是什么:

<TextBlock Foreground="LightGray" Text="Payfast Running" Name="AnimatedTextBlock">
    <TextBlock.Triggers>
        <Trigger Property="Visibility" Value="Visible">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <StringAnimationUsingKeyFrames 
                            Storyboard.TargetProperty="(TextBlock.Text)"
                            Duration="0:0:1.5"
                            Storyboard.TargetName="AnimatedTextBlock"
                            RepeatBehavior="Forever">
                            <DiscreteStringKeyFrame Value="Payfast Running" KeyTime="0:0:0"/>
                            <DiscreteStringKeyFrame Value="Payfast Running." KeyTime="0:0:0:5"/>
                            <DiscreteStringKeyFrame Value="Payfast Running.." KeyTime="0:0:1"/>
                            <DiscreteStringKeyFrame Value="Payfast Running..." KeyTime="0:0:1:5"/>
                        </StringAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
        </Trigger>
    </TextBlock.Triggers>
</TextBlock>

最后,如果可能的话,我需要在标记中执行此操作,而不是CodeBehind。

2 个答案:

答案 0 :(得分:0)

“我希望在TextBlock可见时启动此动画。”

您可以将TextBlock的{​​{1}}绑定到Visibility属性(请注意,您必须为布尔到可见性转换添加资源):

boolean

然后,在<Window.Resources> <BooleanToVisibiltyConverter x:Key="BooleanToVisibilityConverter"/> </Window.Resources> ... <TextBlock Visibility="{Binding Path=ReadyToPlay, Converter={StaticResource BoolToVisConverter}}"/> 属性的setter方法中,您可以添加ReadyToPlay语句,检查是否启动if

Storyboard

通过这样做,当if (value) { // start Storyboard: // find Storyboard instance and call Begin() method on it } 变为ReadyToPlay时,true将变为可见,TextBlock将同时开始。

答案 1 :(得分:0)

您可能需要将其全部包装成样式。

    <TextBlock Foreground="LightGray" Text="Payfast Running" Name="AnimatedTextBlock">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Visibility, RelativeSource={RelativeSource TemplatedParent}}" Value="Visible">
                        <DataTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <StringAnimationUsingKeyFrames 
                                        Storyboard.TargetProperty="(TextBlock.Text)"
                                        Duration="0:0:1.5"                                       
                                        Storyboard.TargetName="AnimatedTextBlock"
                                        RepeatBehavior="Forever">
                                        <DiscreteStringKeyFrame Value="Payfast Running" KeyTime="0:0:0"/>
                                        <DiscreteStringKeyFrame Value="Payfast Running." KeyTime="0:0:0:5"/>
                                        <DiscreteStringKeyFrame Value="Payfast Running.." KeyTime="0:0:1"/>
                                        <DiscreteStringKeyFrame Value="Payfast Running..." KeyTime="0:0:1:5"/>
                                    </StringAnimationUsingKeyFrames>
                               </Storyboard>
                           </BeginStoryboard>
                       </DataTrigger.EnterActions>
                   </DataTrigger>
               </Style.Triggers>
           </Style>
     </TextBlock.Style>
</TextBlock>