动画是应用程序与用户交互的灵魂。目前接触到的更多的关于动画的 官方资料 是通过 EventTrigger.RoutedEvent 事件属性与 BeginStoryboard 配合使用来达到动画的目的。

但是当我在开发过程中需要在指定属性变更之后,才开始动画。这个属性可以是一个 int bool 等任何类型的值。如果要实现值的绑定,在WPF中,需要使用 DataTrigger

以下是我解决该问题时的步骤。完整代码附在最后。

添加依赖属性

创建控件(控件添加一外名称属性 )后,添加一个依赖属性 AnimateStart
创建依赖属性的目的是为了在其他地方使用这个控件的时候,可以绑定到Model的属性上。

/// <summary>
/// 动画开始
/// </summary>
public bool AnimateStart
    get { return (bool)GetValue(AnimateStartProperty); }
    set { SetValue(AnimateStartProperty, value); }
// Using a DependencyProperty as the backing store for AnimateStart.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty AnimateStartProperty =
    DependencyProperty.Register(nameof(AnimateStart), typeof(bool), typeof(SingleRecruit), 
        new PropertyMetadata(false));

在控件中,针对一个元素,在接下来的示例中,使用 Image 进行示范:

Image 添加 Style

同样的,与其他的 DataTrigger 使用方式相同,给 Image 添加 Style,然后在 Style.Triggers 里面设置 DataTrigger
由于 DataTrigger 继承的是 TriggerBase
详细文档看这里

可以使用属性 EnterActionsExitActions 后设置动画。

<Image.Style>
    <Style TargetType="Image">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=UC, Path=AnimateStart}" Value="true">
                <DataTrigger.EnterActions>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>

针对 Image 控件的属性动画

Image.Opacity 属性,可以直接设置,不需要设置上述的 RenderTransform 节点。

<Style.Triggers>
    <DataTrigger Binding="{Binding ElementName=UC, Path=AnimateStart}" Value="true">
        <DataTrigger.EnterActions>
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                     Duration="0:0:1" BeginTime="0:0:0" 
                                     From="1" To="0.2"/>
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
    </DataTrigger>
</Style.Triggers>

针对 RenderTransform 节点的动画

Image 里添加 RenderTransform 节点

添加 RenderTransform 节点的目的在于我们需要对其做位移、旋转、缩放、斜切动画时,需要针对该属性做设置,否则会报错。

<Image.RenderTransform>
     <TransformGroup>
         <ScaleTransform ScaleX="1"/>
         <SkewTransform/>
         <RotateTransform/>
         <TranslateTransform/>
     </TransformGroup>
 </Image.RenderTransform>
 

注:此时不能针对 ScaleTransform 属性设置名称 Name="ScaleProp",然后使用 Storyboard.TargetName="ScaleProp" 方法绑定到 Scale 属性中
解决办法如下,我们需要使用 Storyboard.TargetProperty 来做一次转化
重点在于这一句 Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"

<Style.Triggers>
    <DataTrigger Binding="{Binding ElementName=UC, Path=AnimateStart}" Value="true">
        <DataTrigger.EnterActions>
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
                                     Duration="0:0:1" BeginTime="0:0:0" 
                                     From="1" To="-1"/>
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
    </DataTrigger>
</Style.Triggers>
<Image Source="<Your Image Source Path>"
       RenderTransformOrigin="0.5,0.5">
    <Image.RenderTransform>
        <TransformGroup>
            <ScaleTransform ScaleX="1"/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </Image.RenderTransform>
    <Image.Style>
        <Style TargetType="Image">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=UC, Path=AnimateStart}" Value="true">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                                 Duration="0:0:1" BeginTime="0:0:0" 
                                                 From="1" To="0.2"/>
                                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
                                                 Duration="0:0:1" BeginTime="0:0:0" 
                                                 From="1" To="-1"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>
                    节点的目的在于我们需要对其做位移、旋转、缩放、斜切动画时,需要针对该属性做设置,否则会报错。创建依赖属性的目的是为了在其他地方使用这个控件的时候,可以绑定到Model的属性上。但是当我在开发过程中需要在指定属性变更之后,才开始动画。动画是应用程序与用户交互的灵魂。目前接触到的更多的关于动画的。如果要实现值的绑定,在WPF中,需要使用。创建控件(控件添加一外名称属性 )后,添加一个依赖属性。在控件中,针对一个元素,在接下来的示例中,使用。属性,可以直接设置,不需要设置上述的。配合使用来达到动画的目的。
				
  正如上一章介绍,WPF动画通过一组动画类(Animation类)表示。使用少数几个熟悉设置相关信息,如开始值、结束值以及持续时间。这显然使得它们非常适合于XAML。不是很清晰的时:如何为特定的事件和属性关联动画,以及如何在正确的时间触发动画。   在所有声明式动画中都会用到如下两个要素:   故事板。故事板是BeginAnimation()方法的XAML等价物。通过故事板将动画指定到合适的元素和属性。   事件触发器。事件触发器响应属性变化或事件(如按钮的Click事件),并控制故事板。例如,为了开始.
DataTrigger数据触发器 实现效果: MultiDataTrigger 的 Condition 元素指定,如果 Place 数据项的 Name 和 State 分别为 Portland 和 OR,则相应的 ListBoxItem 的背景设置为 Cyan。 MultiDataTrigger在绑定数据满足一组条件时应用(或多项...
DataTrigger的绑定使用 在绑定数据的时候,我们经常要求数据显示不同的样式,那么,我们绑定的时候就要使用DataTrigger属性对数据进行绑定,首先了解一下数据显示需求,如果某个字段为空,那么字体的颜色为灰色并且设置默认值为“未设置”,如果字段不为空,字体的颜色为蓝色,根据需求,我们要用DataTrigger对数据进行绑定,下面看代码: 上面的通过DataTrigger绑定Label的Content 绑定方式是根据Label自身的属性来进行绑定,如果字段为空,那么就在ViewModel设置默认
<Window x:Class="WpfApp04.TestWin03" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
WPF DataTrigger是一种触发器,用于根据数据绑定的值或属性值的变化来改变控件的外观或行为。当绑定的数据满足指定的条件时,DataTrigger会触发相应的操作,例如更改控件的背景色或者隐藏控件等。使用DataTrigger可以使WPF应用程序更加灵活和交互性。 以下是一个简单的示例,演示如何使用DataTrigger实现当数据绑定的值为"Male"时,更改TextBlock的前景色为红色: <TextBlock Text="{Binding Gender}"> <TextBlock.Style> <Style TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding Gender}" Value="Male"> <Setter Property="Foreground" Value="Red" /> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> CSDN-Ada助手: 恭喜您写了第6篇博客,分享了Rider配置WebApi项目的经验。您的文章内容详实,对读者非常有帮助。希望您能继续保持创作热情,为大家带来更多有价值的技术分享。建议您可以考虑分享一些实践经验,或者结合案例讲解某些技术的应用,这样更容易引起读者的兴趣和共鸣。期待您的下一篇文章。 CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply6 看奖励名单。 【WPF】解决 JetBrains Rider 与 CommunityToolkit.MVVM 的启动报错问题 CSDN-Ada助手: 非常感谢您的分享,解决 JetBrains Rider 与 CommunityToolkit.MVVM 的启动报错问题对很多开发者来说是非常有帮助的。恭喜您写了第5篇博客,继续创作下去,相信您一定会为更多人提供更多有价值的经验和知识。建议您可以继续深入研究一些热门技术或者特定领域的知识,分享给大家,让更多人受益。再次感谢您的分享! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5 【WPF】解决 JetBrains Rider 与 CommunityToolkit.MVVM 的启动报错问题 CSDN-Ada助手: 非常感谢您的第5篇博客,标题看起来十分吸引人!恭喜您能够解决 JetBrains Rider 与 CommunityToolkit.MVVM 的启动报错问题。您的经验一定会对其他人有所帮助。希望您能够继续保持创作的热情,分享更多有价值的内容。下一步,建议您可以尝试探索一些新的主题,挑战自己的技术水平,让读者们更加期待您的下一篇文章! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5