首页 > 其他分享 >Behavior介绍

Behavior介绍

时间:2024-05-09 11:13:00浏览次数:13  
标签:触发 动画 绑定 介绍 Trigger Behavior 播放

WPF Behavior

前提条件

  • 下载Wpf Behavior库 - Microsoft.Xaml.Behaviors.Wpf
    tip: b 是我对应Behavior的代号
    xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
    

介绍

<b:Interaction.Triggers>
    <b:EventTrigger EventName="Loaded">
        <b:CallMethodAction MethodName="Method" TargetObject="{Binding}" />
    </b:EventTrigger>
</b:Interaction.Triggers>

这是一个常见的用法,Iteraction类中定义了两个依赖属性

  • Triggers
  • Behaviors

源码

private static readonly DependencyProperty TriggersProperty = DependencyProperty.RegisterAttached("ShadowTriggers",typeof(TriggerCollection),typeof(Interaction),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnTriggersChanged)));


private static readonly DependencyProperty BehaviorsProperty = DependencyProperty.RegisterAttached("ShadowBehaviors", typeof(BehaviorCollection),typeof(Interaction),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnBehaviorsChanged)));

Trigger

Trigger的类型为TriggerCollection,可以为其添加多个TriggerBase,Behavior包为我们提供了多种Trigger,一下介绍一些常用的Trigger

EventTrigger

事件触发,EventName为事件名称,SourceObject为触发事件的对象,默认为附加的依赖属性

<b:EventTrigger EventName="Click" SourceObject="{Binding ElementName=button}"/>

DataTrigger

数据触发,Binding为绑定数据,Value为绑定数据中的值,当Binding的值等于Value时触发

<b:DataTrigger  Binding="{Binding ElementName=checkBox, Path=IsChecked}" Value="true" />

PropertyChangedTrigger

属性改变触发,Binding为绑定数据,当Binding的值改变时触发

<b:PropertyChangedTrigger Binding="{Binding ElementName=checkBox, Path=IsChecked}"/>

Action

CallMethodAction

调用方法,MethodName为方法名称,TargetObject为方法所属的对象,默认为附加的依赖属性

<b:CallMethodAction MethodName="Method" TargetObject="{Binding Object}" />

InvokeCommandAction

<b:InvokeCommandAction Command="{Binding TestActiveCommand}" />

ControlStoryboardAction

ControlStoryboardAction表示将在执行时更改指定Storyboard状态的操作。使用此行为可以使用ControlStoryboard属性触发和控制指定的Storyboard


ControlStoryboardOption 枚举

方法名称 描述
Start 开始播放动画
Stop 停止播放动画
Pause 暂停播放动画
Resume 恢复播放动画
SkipToFill 跳过动画
TogglePlayPause 切换播放和暂停

<UserControl.Resources>
  <Storyboard x:Key="StoryboardSample" AutoReverse="True" RepeatBehavior="Forever">
    <DoubleAnimation Duration="0:0:2.2" To="0.35"
      Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"
      Storyboard.TargetName="StoryboardRectangle" d:IsOptimized="True"/>
    <DoubleAnimation Duration="0:0:2.2" To="0.35"
      Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"
      Storyboard.TargetName="StoryboardRectangle" d:IsOptimized="True"/>
  </Storyboard>
 </UserControl.Resources>

<Rectangle x:Name="StoryboardRectangle" />
<Button x:Name="button">
  <Behaviors:Interaction.Triggers>
    <Behaviors:EventTrigger EventName="Click">
      <Behaviors:ControlStoryboardAction Storyboard="{StaticResource StoryboardSample}" ControlStoryboardOption="TogglePlayPause"/>
    </Behaviors:EventTrigger>
  </Behaviors:Interaction.Triggers>
</Button>

GoToStateAction

GoToStateAction表示在触发时会将FrameworkElement(即Button)转换为指定的VisualState的操作。此行为会将TargetObjectTargetName指定的元素更改为可视状态StateName。除非UseTrantions设置为false,否则当前状态和新状态之间的任何转换都将播放。

<Button x:Name="sampleStateButton">
  <Button.Resources>
    <Style TargetType="Button" >
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="Button">
            <Grid x:Name="BaseGrid">
              <VisualStateManager.VisualStateGroups>
                <VisualStateGroup>
                  <VisualState x:Name="Normal">
                    <Storyboard>
                      <DoubleAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="Opacity" To="1.0" From="1.0"/>
                    </Storyboard>
                  </VisualState>
                  <VisualState x:Name="Disabled">
                    <Storyboard>
                      <DoubleAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="Opacity" To="0.25" From="1.0"/>
                    </Storyboard>
                  </VisualState>
                </VisualStateGroup>
              </VisualStateManager.VisualStateGroups>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Button.Resources>
</Button>

<CheckBox x:Name="checkBox">
  <Behaviors:Interaction.Triggers>
    <Behaviors:DataTrigger Binding="{Binding IsChecked, ElementName=checkBox}" Value="False">
      <Behaviors:GoToStateAction StateName="Normal" TargetObject="{Binding ElementName=sampleStateButton}"/>
    </Behaviors:DataTrigger>
    <Behaviors:DataTrigger Binding="{Binding IsChecked, ElementName=checkBox}" Value="True">
      <Behaviors:GoToStateAction StateName="Disabled" TargetObject="{Binding ElementName=sampleStateButton}"/>
    </Behaviors:DataTrigger>
  </Behaviors:Interaction.Triggers>
</CheckBox>

Behavior

Behavior是一个行为,当事件发生时,会触发Behavior中的行为

ConditionBehavior

条件行为,ConditionalExpression为条件表达式,当条件表达式为真时,触发Behavior中的行为

<b:Interaction.Triggers>
    <b:EventTrigger EventName="Click" SourceObject="{Binding ElementName=Button}">
        <b:Interaction.Behaviors>
            <b:ConditionBehavior>
                <b:ConditionalExpression>
                    <b:ComparisonCondition LeftOperand="{Binding Path=Items.Count, ElementName=TabControl}" RightOperand="0" />
                </b:ConditionalExpression>
            </b:ConditionBehavior>
        </b:Interaction.Behaviors>
        <b:ChangePropertyAction/>
    </b:EventTrigger>
</b:Interaction.Triggers>

DataStateBehavior

当行为绑定到的数据等于某个值时,DataStateBeact执行操作。每当更新关联的绑定时,此行为都会检查绑定结果是否等于某个值。如果两个值相等,则转换为TrueState。否则,它会转换为FalseState

<Button x:Name="sampleStateButton">
  <Button.Resources>
    <Style TargetType="Button" >
      <Setter Property="Template">
        <Setter.Value>
           <ControlTemplate TargetType="Button">
           <Grid x:Name="BaseGrid" Background="DeepPink">
             <VisualStateManager.VisualStateGroups>
               <VisualStateGroup>
                 <VisualState x:Name="Normal">
                   <Storyboard>
                     <ColorAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="DarkBlue" From="DeepPink" />
                   </Storyboard>
                  </VisualState>
                  <VisualState x:Name="Blue">
                    <Storyboard>
                      <ColorAnimation Storyboard.TargetName="BaseGrid" Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="DeepPink" From="DarkBlue" Duration="Forever" />
                    </Storyboard>
                  </VisualState>
                </VisualStateGroup>
              </VisualStateManager.VisualStateGroups>
              <Behaviors:Interaction.Behaviors>
                <Behaviors:DataStateBehavior Binding="{Binding Text, ElementName=MyText}" Value="" TrueState="Normal" FalseState="Blue" />
              </Behaviors:Interaction.Behaviors>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Button.Resources>
</Button>

标签:触发,动画,绑定,介绍,Trigger,Behavior,播放
From: https://www.cnblogs.com/yinyuessh/p/18181672

相关文章

  • 面向对象的三大特性、封装的介绍及属性、装饰器property、员工管理系统
    【一】面向对象的三大特性封装:封装指的就是把数据与功能都整合到一起继承多态【二】什么是封装封装是对具体对象的一种抽象意思就是将某部分功能和代码隐藏起来,在程序外边看不到,只能在程序内部使用【三】为什么要封装?封装数据的主要原因是:保护隐私(把不想别人......
  • 个人练习(每个同学都要提交)——学习和使用多个平台上的测试工具 请使用两种以上平台上
    答:在"校园跑腿"项目中,我们可以使用两种不同的测试工具来确保软件的质量和稳定性。这些测试工具可以包括自动化测试工具和手动测试工具。以下是两种测试工具的介绍以及如何在项目中使用它们:SeleniumWebDriver(自动化测试工具):SeleniumWebDriver是一个流行的自动化测试工具,用于测......
  • 个人练习(每个同学都要提交)——学习和使用多个平台上的测试工具 请使用两种以上平台上
    在本小组项目中,我们使用以下两种平台上的测试工具:Postman和Swagger。Postman:Postman是一款功能强大的API测试工具,可以用于创建、调试和测试API。首先,我们需要创建一个Postman账号,并安装Postman应用程序。在项目中,我们可以使用Postman来进行API端点的测试。我们可以创建多个请求......
  • Vue2工程化介绍
    Vue2项目[基于vue-cli]工程化【一】环境搭建06-Vue-cli-刘清政-博客园(cnblogs.com)安装node使用npm/cnpmnpm换源:npmconfigsetregistryhttps://registry.npmmirror.com安装vue-clicnpminstall-g@vue/cli#安装脚手架cnpminstall-g@vue/cli#切换目录......
  • 编程语言和Python语言介绍
    编程语言和Python语言介绍一、【编程语言介绍】【1】机器语言(1)机器语言是什么机器语言就是计算机可以理解的语言,可以直接通过机器语言操作我们的硬件计算机是基于电工作的,高频是0,低频是1计算机通过控制高低频变化来工作(2)机器指令通过制高低电频的变化组成一系列的指令......
  • MMU相关介绍
    什么是MMUMMU即内存管理单元(MemoryManageUnit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最困难的知识点之一。1)概述研究MMU无法绕过的一个东西就是分页内存管理机制,也就是研究——页表。页表内存放的就是虚拟地址到物理地址的转换关系,也就是虚拟地址......
  • NumPy 数组切片及数据类型介绍
    NumPy数组切片NumPy数组切片用于从数组中提取子集。它类似于Python中的列表切片,但支持多维数组。一维数组切片要从一维数组中提取子集,可以使用方括号[]并指定切片。切片由起始索引、结束索引和可选步长组成,用冒号:分隔。语法:arr[start:end:step]start:起始索引(默认......
  • NTFS和FAT32区别介绍
      FAT32和NTFS是两种不同的文件系统,它们之间存在一些显著的差异。以下是它们之间的主要区别: 1. 支持的分区大小:  NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB(2048GB),而FAT32支持分区的大小最大为32GB(尽管FAT32文件系统可以支持的最大分区容量为2TB,但在Windo......
  • Dash 2.17版本新特性介绍
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master大家好我是费老师,不久前Dash发布了其2.17.0版本,执行下面的命令进行最新版本Dash的安装:pipinstalldash-U2.17版本中新增了多项重要的新功能,使得我们在开发Dash应用功能时更加的得心应......
  • BCM53161XUB0KLFBG、BCM53161XMB0KLFBG、BCM53161XMB0ILFBG: 超低功耗2.5GE交换机介绍
    产品介绍BCM5316X超低功耗2.5GE交换机设计用于SMB、工业和服务提供商市场中的多GE应用。BCM5316X交换机支持四个2.5GESGMII+端口、两个2.5GE/10GEXFI/SFI端口以及多达八个带集成GPHY的10/100/1000Base-T端口。BCM5316X交换机采用28nmRoboSwitch™架构(也称为Robo-2)。BCM5316X集......