如何使用数据触发器停止自定义情节提要?

Posted

技术标签:

【中文标题】如何使用数据触发器停止自定义情节提要?【英文标题】:How can I stop a custom storyboard with a data trigger? 【发布时间】:2021-03-25 06:21:57 【问题描述】:

我有一个画布故事板,我想在 ShowError 属性发生更改后立即停止它。

 <UserControl.Resources>
        <Storyboard x:Key="LoaderAnimation" Name="LoaderAnimation" >
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
                                           Storyboard.TargetName="canvas" 
                                           RepeatBehavior="Forever">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:3" Value="360"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </UserControl.Resources>


        <Viewbox x:Name="LayoutRoot" HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="0" Height="150" Width="250">
            <Canvas Height="323" Width="308" RenderTransformOrigin="0.5,0.5" x:Name="canvas">
                <Canvas.RenderTransform>
                    <RotateTransform/>
                </Canvas.RenderTransform>

                <Ellipse Fill="Binding Foreground, ElementName=userControl" Height="71" Canvas.Left="121" Canvas.Top="21" Width="69" Opacity="0.3"/>
                <Ellipse Fill="Binding Foreground, ElementName=userControl" Height="71" Width="69" Canvas.Left="194" Canvas.Top="52" Opacity="0.4"/>
                <Ellipse Fill="Binding Foreground, ElementName=userControl" Width="69" Height="71" 

            </Canvas>
        </Viewbox>

        <TextBlock Grid.Row="1" TextWrapping="Wrap" FontSize="20" Margin="0 20 0 0">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="Binding ShowError" Value="false">
                            <Setter Property="Text" Value="loc:Translate LogIn.TestSpsConnection" />
                            <Setter Property="Foreground" Value="Black" />
                        </DataTrigger>
                        <DataTrigger Binding="Binding ShowError" Value="true">
                            <Setter Property="Text" Value="loc:Translate LogIn.FailSpsConnection" />
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
        
    </Grid>

我尝试了所有想法,但无法从 TextBlock 的样式访问情节提要。 当 ShowError 为真时,有什么方法可以停止动画吗? 谢谢你的帮助

【问题讨论】:

【参考方案1】:

尝试在您的 Canvas 上应用样式触发器,当 ShowError 为真时停止情节提要,而不是从您的 TextBlock 中执行。

例子:

   <UserControl.Resources>
        <Storyboard x:Key="LoaderAnimation" Name="LoaderAnimation" >
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
                                           RepeatBehavior="Forever">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:3" Value="360"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </UserControl.Resources>

...

<Canvas Height="323" Width="308" RenderTransformOrigin="0.5,0.5" x:Name="canvas">
    ...
    <Canvas.Style>
        <Style TargetType="Canvas">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                    <EventTrigger.Actions>
                        <BeginStoryboard x:Name="beginStoryboard" Storyboard="StaticResource LoaderAnimation"/>
                    </EventTrigger.Actions>
                </EventTrigger>
                <DataTrigger Binding="Binding ShowError" Value="True">
                    <DataTrigger.EnterActions>
                        <StopStoryboard BeginStoryboardName="beginStoryboard"/>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Canvas.Style>
</Canvas>

另外,请注意,我已从您的资源中删除了 Storyboard.TargetName,否则在以我的方式使用时违反了某些 XAML 规则。如果你把它放在那里,你会得到运行时错误。

【讨论】:

以上是关于如何使用数据触发器停止自定义情节提要?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个 tableView 中使用两个不同的自定义单元格?使用情节提要,iOS 7

如何使用情节提要从自定义 uitableviewcell 正确启动弹出框转场

如何使用情节提要在界面构建器中连接自定义 UIView?

如何使用创建的自定义 IBDesignable 类从情节提要中更改按钮的角半径

如何在情节提要场景中嵌入自定义视图 xib?

如何使用 RepeatBehaviour="Forever" 停止情节提要