首页 > 其他分享 >DataTrigger 数据触发器触发动画的方式及问题解决

DataTrigger 数据触发器触发动画的方式及问题解决

时间:2024-06-20 11:22:12浏览次数:12  
标签:动画 触发器 触发 DataTrigger Trigger 数据

在WPF 中通过触发器实现动画的方式很常见,这里记录一下再使用DataTrigger 数据触发器触发动画的一些经验,以便备忘。

一、数据触发器 DataTrigger 与普通的触发器Trigger 区别:

  1. Trigger 普通触发器
<!--样式-->
<Style TargetType="TextBlock">
   <Style.Triggers>
      <!--这里是通过属性来决定触发条件的,修改样式-->
      <Trigger Property="IsMouseOver" Value="true">  
         <Setter Foreground="Red"/>
	  </Trigger>
   <Style.Triggers>
</Style>
<!--动画-->
<Style TargetType="TextBlock">
   <Style.Triggers>
      <!--这里是通过属性来决定触发条件的,修改样式-->
      <Trigger Property="IsMouseOver" Value="true">  
         <Trigger.EnterActions>
		   <BeginStoryBoard>
		       <StoryBoard>
			      <DoubleAnimiation To="500" Duration="0:0:2" />
               </StoryBoard>
		   </BeginStoryBoard>
		 <Trigger.EnterActions>
	  </Trigger>
   <Style.Triggers>
</Style>


2.DataTrigger 数据触发器

<!--样式-->
<Style TargetType="TextBlock">
   <Style.Triggers>
   <!--这里使用的是Binding 而不再是Property,这样可以方便绑定其他对象,并通过其他对象的参考值变化决定是否触发样式修改或动画执行-->
      <DataTrigger Binding={Binding ElementName="txt",Path=Text},Value="开" >
	    <Setter Property="Foreground" Value="Red" />
	  <DataTrigger>
   </Style.Triggers>
</Style>

<!--动画-->
<Style TargetType="TextBlock">
   <Style.Triggers>
   <!--这里使用的是Binding 而不再是Property,这样可以方便绑定其他对象,并通过其他对象的参考值变化决定是否触发样式修改或动画执行-->
      <DataTrigger Binding={Binding ElementName="txt",Path=Text},Value="开" >
	    <DataTrigger.EnterActions>
		  <BeginStoryBoard>
		     <StoryBoard>
			   <DoubleAnimation  此处省略动画 />
			 </StoryBoard>
		  </BeginStoryBoard>
		 <DataTrigger.EnterActions>
	  <DataTrigger>
   </Style.Triggers>
</Style>

以上动画存在问题,即动画在第一个执行周期正常,以后就不在执行了。

解决方法:在定义故事板前增加删除故事板命令 <RemoveStoryBoard BeginStoryBoardName="bsb1" /> 下面以具体示例演示:

Code

<Window x:Class="WpfApp11.Window1"
        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"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp11"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Window.Resources>
        <Style x:Name="style1" TargetType="{x:Type StackPanel}">
            
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <TranslateTransform  X="{Binding ElementName=Window1,Path=ActualWidth}" />
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=txt,Path=Text}" Value="停放制动">
                    <DataTrigger.EnterActions>
					   <!--先删除可能已存在的故事板 -->
                        <RemoveStoryboard BeginStoryboardName="ATingFangZhiDong" />
                        <RemoveStoryboard BeginStoryboardName="ATingFangHuanJie" />
                        <BeginStoryboard x:Name="ATingFangZhiDong">
                            <Storyboard>
                                <DoubleAnimation To="500" Duration="0:0:2" AccelerationRatio="0.7" Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                   
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=txt,Path=Text}" Value="停放缓解">
                    <DataTrigger.EnterActions>
					 <!--先删除可能已存在的故事板 -->
                        <RemoveStoryboard BeginStoryboardName="ATingFangZhiDong" />
                        <RemoveStoryboard BeginStoryboardName="ATingFangHuanJie" />
                        <BeginStoryboard x:Name="ATingFangHuanJie">
                            <Storyboard>
                                <DoubleAnimation To="0" Duration="0:0:2" AccelerationRatio="0.7" Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel x:Name="Sp1" Background="LightBlue" Grid.Row="1">
           
        </StackPanel>
        <TextBox x:Name="txt" Height="25" Margin="10" Width="100" HorizontalAlignment="Left" />
    </Grid>
</Window>

标签:动画,触发器,触发,DataTrigger,Trigger,数据
From: https://www.cnblogs.com/sundh1981/p/18258303

相关文章

  • 【C#】WPF 使用Storyboard故事板做动画效果
    <Stylex:Key="ButtonAnimationBlueStyle"BasedOn="{x:Null}"TargetType="{x:TypeButton}"><SetterProperty="Template"><Setter.Value><ControlTem......
  • 【html】爱心跳动动画:CSS魔法背后的故事
     效果展示:代码介绍:爱心跳动动画:CSS魔法背后的故事在前端开发中,CSS不仅仅是一种用于控制网页样式的工具,它也是一种表达创意和想象力的艺术手段。今天,我要为大家介绍一段使用CSS实现的爱心跳动动画代码,这段代码将带您领略CSS的魔法之处。首先,我们来整体看一下这个动画的结......
  • CSS动画(个人资料卡片)
    1.整体效果https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa63Oz8IaRI51Mw7mY02LHmnpXicG4icA3ERN1MVszMdNafsgV3xaVHLhMA6avquSJux4CLV8uggtfbw/640?wx_fmt=gif&from=appmsg&wxfrom=13今天呈现的不仅是一个个人介绍界面,而是一次交互式的视觉体验。精心编排的HTML与CSS......
  • 微信小程序使用PAG动画
    uniapp开发微信小程序播放PAG动画准备工作pag动画文件网络地址uni插件市场搜索pag(腾讯pag)安装导入插件到项目中安装插件中的依赖npminstalllibpag-miniprogram--save注意事项:如果小程序控制台报错提示未加载wasm,请把node_modules/libpag-miniprogram/lib/libpa......
  • JQuery高级29_动画&遍历1
    一、动画三种方式显示和隐藏元素1、默认显示和隐藏方式 1.show([speed,[easing],[fn]]) 参数:   1.speed:动画的速度。三个预定义的值("slow","normal","fast")或表示动画时长的毫秒数值(如:1000)   2.easing:......
  • Character Animator 2024 mac/win版:赋予角色生命,动画更传神
    CharacterAnimator2024是一款强大的角色动画制作软件,以其创新的功能和卓越的性能,为动画师、游戏开发者以及设计师们带来了全新的创作体验。CharacterAnimator2024mac/win版获取 这款软件采用了先进的骨骼绑定技术,使得角色动画的制作变得更为轻松和精准。用户可以轻松地......
  • MySQL触发器基本结构
    1、修改分隔符符号delimiter $$可以修改成$$//都行2、创建触发器函数名称createtrigger函数名3、什么样的操作触发,操作那个表after:....之后触发befor:....之前触发insert:插入被触发update:修改被触发delete:删除被触发on表名实例:在users表被添加信息后触发after......
  • MySQL触发器基本结构
    1、修改分隔符符号delimiter$$可以修改成$$//都行2、创建触发器函数名称createtrigger函数名3、什么样的操作触发,操作那个表after:....之后触发befor:....之前触发insert:插入被触发update:修改被触发delete:删除被触发on表名实例:在users表被添加信息后......
  • MySQL触发器基本结构
    1、修改分隔符符号delimiiter$$可以修改成$$//都行2、创建触发器函数名称createtrigger函数名3、什么样的操作触发,操作哪个表after:···之后触发before:···之前触发insert:插入被触发update:修改被触发delete:删除被触发on表名实例:在user表被添加信息后触发......
  • CSS动画(登录页面)
    1.整体效果https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6Pfop3IiakrZOtiaiaKniaxeH2Gs407DmkXPsMo8AFKdsYibYcpZiboc24Ulic2CicmyvHmnwCrib7MDe6Jvg/640?wx_fmt=gif&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=12.完整代码HTML<!DOCTYPEhtml>......