2012-08-14 123 views
3

我有一个小的椭圆,我想每次将依赖项属性设置为true时刷新。由于该属性可以在几毫秒内很快从真实回到错误,所以我需要使用动画而不是简单的样式数据触发器来完成此操作。基本上,我只是想要真正的值在椭圆上ping动画。WPF动画只触发一次

<Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0"> 
    <Ellipse.Fill> 
     <SolidColorBrush /> 
    </Ellipse.Fill> 
    <Ellipse.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsReceiving}" Value="True" > 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color"> 
            <ColorAnimationUsingKeyFrames.KeyFrames> 
             <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/> 
             <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/> 
            </ColorAnimationUsingKeyFrames.KeyFrames> 
           </ColorAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Ellipse.Style> 
</Ellipse> 

这个动画似乎有用,但它只在第一次触发值时才会触发。我错过了什么吗?

更新: 感谢您输入的每个人。事实证明,这是一个线程问题。最初,我在控件上有一个DP,它绑定到实现INotifyPropertyChanged的视图模型。然后我尝试删除控制器上的DP,并将我的视图模型属性转换为DP。繁荣,那时我开始出现一个错误,指出一个不同的线程拥有这个对象。我意识到我需要使用Reactive Extensions来合并一些Observable,正如我在应用程序的其他部分所做的一样。我用PropertyChanged()恢复到视图模型的传统属性,并简单地将其绑定到控件的动画。现在一切都完美无缺。

回答

0

您需要提供IsReceiving属性的定义。基于假设你有一个在True和False之间切换的属性(IsReceiving),这会触发这个动画效果:如果你只看到效果触发一次:

1)检查属性是无论是DependencyProperty还是正确使用INotifyPropertyChanged来更新视图。
2)检查属性设置器是否实际从True更改为False并返回。

1
<Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0"> 
     <Ellipse.Fill> 
      <SolidColorBrush /> 
     </Ellipse.Fill> 
     <Ellipse.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsReceiving,Mode=TwoWay}" Value="True" > 
         <DataTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color"> 
             <ColorAnimationUsingKeyFrames.KeyFrames> 
              <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/> 
              <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/> 
             </ColorAnimationUsingKeyFrames.KeyFrames> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </DataTrigger.EnterActions> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Ellipse.Style> 
    </Ellipse> 

尝试使用模式=双向

+2

为什么你要绑定双向呢? – franssu 2012-08-14 11:59:00

0

我无法重现你的问题。这里是我的代码隐藏:

public partial class MainWindow : Window 
{ 
    public static readonly DependencyProperty IsReceivingProperty = 
     DependencyProperty.Register("IsReceiving", 
            typeof(bool), typeof(MainWindow)); 

    public bool IsReceiving 
    { 
     get { return (bool)GetValue(IsReceivingProperty); } 
     set { SetValue(IsReceivingProperty, value); } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     myEllipse.DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.IsReceiving = true; 
     this.IsReceiving = false; 
    } 
} 
3

我有一个类似的问题,我有一个“中”和“出”的动画时,DP改为被解雇。第一个周期工作正常,但之后没有发生任何事情。我通过在BeginStoryboard操作前添加RemoveStoryboard EnterActions来解决此问题。

<Border Name="Zyzzyx" Grid.Row="1" Background="DarkRed" Height="0" VerticalAlignment="Bottom"> 
    <Border.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=SelectionState, ElementName=ControlRoot, Mode=OneWay}" Value="Selecting"> 
        <DataTrigger.EnterActions> 
         <RemoveStoryboard BeginStoryboardName="AnimateIn" /> 
         <RemoveStoryboard BeginStoryboardName="AnimateOut" /> 
         <BeginStoryboard Name="AnimateIn" HandoffBehavior="SnapshotAndReplace"> 
          <Storyboard FillBehavior="HoldEnd" Duration="0:0:5"> 
           <DoubleAnimation To="30" Duration="0:0:5" Storyboard.TargetProperty="Height" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=SelectionState, ElementName=ControlRoot, Mode=OneWay}" Value="Deselecting"> 
        <DataTrigger.EnterActions> 
         <RemoveStoryboard BeginStoryboardName="AnimateIn" /> 
         <RemoveStoryboard BeginStoryboardName="AnimateOut" /> 
         <BeginStoryboard Name="AnimateOut" HandoffBehavior="SnapshotAndReplace"> 
          <Storyboard FillBehavior="HoldEnd" Duration="0:0:5"> 
           <DoubleAnimation To="0" Duration="0:0:5" Storyboard.TargetProperty="Height" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 

<!-- Border content --> 

</Border> 
+0

奇怪。这背后有解释吗? – MrZander 2015-11-13 22:53:25

1

我也看到了类似的问题来解决我的问题,我发现我已经在DataTrigger的ExitActions添加StopStoryboard标签。

1
   <DataTrigger.EnterActions> 
        <RemoveStoryboard BeginStoryboardName="AnimateIn" /> 
        <RemoveStoryboard BeginStoryboardName="AnimateOut" /> 
        <BeginStoryboard ...> 
       </DataTrigger.EnterActions> 

的作品,但我认为这是更好地使用

   <DataTrigger.EnterActions> 
        <BeginStoryboard Name="FadeIn"...> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <RemoveStoryboard BeginStoryboardName="FadeIn" /> 
       </DataTrigger.ExitActions>