2012-08-14 162 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>