【问题标题】:wpf databinding datatrigger to animate a rectanglewpf数据绑定数据触发器为矩形设置动画
【发布时间】:2014-06-25 16:48:39
【问题描述】:

我正在使用 MVVM,因此我需要将一个矩形绑定到一个属性,该属性最终会对其进行动画处理。 我发现很少solutions 并试图复制他们的方法,但故事范围没有发挥作用 我包括我的源代码

<Rectangle x:Name="RectangleCompleted" HorizontalAlignment="Left" Height="50" Margin="440,178,0,0" VerticalAlignment="Top" Width="100" Stroke="#FF0BB3AE" StrokeThickness="5"           RadiusX="8" RadiusY="7" >   

<i:Interaction.Triggers>
    <ei:DataTrigger Binding="{Binding Path=Animation}" Value="ON" Comparison="Equal">
      <ei:ControlStoryboardAction
      Storyboard="{StaticResource MyAnimation}" ControlStoryboardOption="Play"/>
   </ei:DataTrigger>
</i:Interaction.Triggers>

<Rectangle.Effect>
   <DropShadowEffect RenderingBias="Quality" ShadowDepth="3" Color="#FFD2D6D8"/>
</Rectangle.Effect>
    <Rectangle.Fill>
       <SolidColorBrush Color="#FFE7F4F6"/>
   </Rectangle.Fill>
</Rectangle>

<Window.Resources>        
   <Storyboard x:Key="MyAnimation">
      <DoubleAnimation
       Storyboard.TargetName="RectangleCompleted"
       Storyboard.TargetProperty="Opacity"
       From="0"
       To="1"
       RepeatBehavior="Forever"
       AutoReverse="True"/>
  </Storyboard>
</Window.Resources>

【问题讨论】:

    标签: wpf mvvm datatrigger


    【解决方案1】:

    您的Animation 属性是bool 还是string?如果它是布尔值,您需要在触发器中检查 True 或 False 的值。如果它是一个字符串,那么你应该对你所得到的没问题。如果您的 INPC 实现和 Animation 属性是正确的,这应该可以正常工作。

    我已经将一个示例与您发布的代码放在一起,您应该会看到它运行良好。 Download Link

    我做了两个小改动。我添加了一个按钮来切换动画以启动或停止并将整个内容放在StackPanel 中。其次,我将Animation 属性设置为布尔值,因此只需使用触发器来检查“真”或“假”,而不是您要检查的“开”值。

    <StackPanel x:Name="LayoutRoot">
      <Rectangle x:Name="RectangleCompleted"
                  Width="100"
                  Height="50"
                  RadiusX="8"
                  RadiusY="7"
                  Stroke="#FF0BB3AE"
                  StrokeThickness="5">
        <Rectangle.Resources>
          <Storyboard x:Key="MyAnimation">
            <DoubleAnimation AutoReverse="True"
                              From="0"
                              RepeatBehavior="Forever"
                              Storyboard.TargetName="RectangleCompleted"
                              Storyboard.TargetProperty="Opacity"
                              To="1" />
          </Storyboard>
        </Rectangle.Resources>
        <i:Interaction.Triggers>
          <ei:DataTrigger Binding="{Binding Path=Animation}"
                          Comparison="Equal"
                          Value="True">
            <ei:ControlStoryboardAction ControlStoryboardOption="Play"
                                        Storyboard="{StaticResource MyAnimation}" />
          </ei:DataTrigger>
          <ei:DataTrigger Binding="{Binding Path=Animation}"
                          Comparison="Equal"
                          Value="False">
            <ei:ControlStoryboardAction ControlStoryboardOption="Stop"
                                        Storyboard="{StaticResource MyAnimation}" />
          </ei:DataTrigger>
        </i:Interaction.Triggers>
        <Rectangle.Effect>
          <DropShadowEffect RenderingBias="Quality"
                            ShadowDepth="3"
                            Color="#FFD2D6D8" />
        </Rectangle.Effect>
        <Rectangle.Fill>
          <SolidColorBrush Color="#FFE7F4F6" />
        </Rectangle.Fill>
      </Rectangle>
      <Button Command="{Binding ToggleCommand}"
              Content="Toggle Animation" />
    </StackPanel>
    

    ToggleCommand 所做的只是:

    ToggleCommand = new RelayCommand(() => Animation = !Animation);
    

    更新:

    如果您只想在窗口加载时触发动画,您只需要:

    <Window.Resources>
      <Storyboard x:Key="MyAnimation">
        <DoubleAnimation AutoReverse="True"
                          From="0"
                          RepeatBehavior="Forever"
                          Storyboard.TargetName="RectangleCompleted"
                          Storyboard.TargetProperty="Opacity"
                          To="1" />
      </Storyboard>
    </Window.Resources>
    <Window.Triggers>
      <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource MyAnimation}" />
      </EventTrigger>
    </Window.Triggers> 
    

    【讨论】:

    • 谢谢 Viv,很好。我可以不使用命令吗?我想在窗口加载时制作动画
    • @ssq 此示例中的命令与您的原始问题无关。所以你可以删除它,只需一个触发器即可启动动画。这是我添加的内容,以显示如何停止动画。命令是 MVVM 的基本部分。绑定和命令有助于将视图与 VM 分离
    • 我明白这一点,但在我的情况下(在你的例子中)我无法触发动画,即初始化 Animation=true(不起作用)所以基本上我的问题是通过 ViewModel 触发窗口加载动画
    • @ssq 在你的问题中你提到加载窗口触发你的动画?虚拟机与为视图的加载事件触发此事件有什么关系?对不起,你刚刚失去了我。如果您希望在加载窗口时触发动画,只需对窗口加载事件使用事件触发器并启动情节提要。
    • 我想这就是我所说的故事板不启动的意思?根据我的理解,绑定动画值(绑定路径=动画)的变化应该启动动画吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2011-08-08
    • 2014-10-09
    • 2023-04-10
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多