【问题标题】:use data trigger control the storyboard, but only trigger one time使用数据触发控制情节提要,但只触发一次
【发布时间】:2023-03-21 22:32:01
【问题描述】:

我使用数据触发器来控制一些情节提要,但它只能触发一次。

 <Style x:Key="PropertyTriggerExampleButtonStyle" TargetType="{x:Type Button}">           
        <Setter Property="Width" Value="200" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding para}" Value="0">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
              To="500" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>                 
            </DataTrigger>
            <DataTrigger Binding="{Binding para}" Value="1">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width"
              To="200" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>                   
            </DataTrigger>            
        </Style.Triggers>
    </Style>
<Button Style="{StaticResource PropertyTriggerExampleButtonStyle}">
        button width will be changed
    </Button>

para 是一个变量(已经实现了 INotifyPropertyChanged 接口),它将由另一个按钮控制。其值为 0 或 1。

但是当我单击按钮更改参数值时,情节提要仅针对每个值(0 和 1)触发一次。以后永远不会触发。

如果我将第二个故事板放入第一个数据触发器的 ExitActions 标记中。它会运作良好。但是我有超过 2 个故事板需要控制......

以下代码效果很好,但我需要根据不同的值控制许多故事板(超过 2 个)....

<Style.Triggers>
            <DataTrigger Binding="{Binding para}" Value="0">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width" To="500" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>     
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Width" To="200" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>                       
        </Style.Triggers>

【问题讨论】:

    标签: storyboard datatrigger


    【解决方案1】:

    我遇到了同样的问题,然后我给了Timeline.FillBehavior="Stop",这对我有用。

    检查: Microsoft - Timeline Class Reference - Timeline.FillBehavior Property

    【讨论】:

      【解决方案2】:

      您可以使用 System.Windows.Interaction.Interactivity with condition 来启动情节提要。

      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

      <Border x:Name="brd" MinWidth="20" Height="20">
      <TextBlock Text="{Binding Text}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
      <Border.Resources>
          <Storyboard x:Key="Story" Duration="1000"
                  Storyboard.TargetName="brd"
                  Storyboard.TargetProperty="Background">
              <ObjectAnimationUsingKeyFrames>
                  <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="#81bb8c" />
                  <DiscreteObjectKeyFrame KeyTime="0:0:0.9" Value="{x:Null}" />
              </ObjectAnimationUsingKeyFrames>
          </Storyboard>
          <Storyboard x:Key="Story2" Duration="1000"
                  Storyboard.TargetName="brd"
                  Storyboard.TargetProperty="Background">
              <ObjectAnimationUsingKeyFrames>
                  <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="#bb818c" />
                  <DiscreteObjectKeyFrame KeyTime="0:0:0.9" Value="{x:Null}" />
              </ObjectAnimationUsingKeyFrames>
          </Storyboard>
      </Border.Resources>
      <i:Interaction.Triggers>
          <ei:DataTrigger Binding="{Binding LastClick}" Value="0"
                  Comparison="GreaterThan">
              <ei:ControlStoryboardAction 
                   Storyboard="{StaticResource Story}" ControlStoryboardOption="Play" />
          </ei:DataTrigger>
          <ei:DataTrigger Binding="{Binding LastClick}" Value="0"
                  Comparison="LessThan">
              <ei:ControlStoryboardAction 
                   Storyboard="{StaticResource Story2}" ControlStoryboardOption="Play" />
          </ei:DataTrigger>
      </i:Interaction.Triggers></Border>
      

      【讨论】:

      • 我用你的方法。它运作良好。非常感谢。但是,为什么旧​​方法行不通?我很困惑.....
      • 触发器之间存在竞争。这是一个带有命名 StoryBoard 的 WPF 示例。 link
      • 感谢您的帮助。
      猜你喜欢
      • 2020-01-01
      • 2017-05-27
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2017-09-14
      • 2020-07-23
      相关资源
      最近更新 更多