2014-04-07 1 views
0

Я определил раскадровку в источнике XAML UserControl. Он играет, когда эта функция вызывается:Последующие звонки в раскадровку. Вставить (это, правда) замять анимацию

/// <summary> 
/// Plays highlight animation. 
/// </summary> 
public void Highlight() 
{ 
    Storyboard highlighter = FindResource("Highlight") as Storyboard; 
    highlighter.Begin(this, true); 
} 

Это хорошо работает до тех пор, как анимация уже не играет, когда эта функция вызывается. Когда я вызываю функцию до того, как раскадровка закончит игру, анимация застрянет бесконечно. Почему это происходит? Вот источник анимации:

<Storyboard x:Key="Highlight" AutoReverse="True"> 
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Border"> 
     <EasingColorKeyFrame KeyTime="0:0:0.15" Value="LightGray"> 
      <EasingColorKeyFrame.EasingFunction> 
       <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
      </EasingColorKeyFrame.EasingFunction> 
     </EasingColorKeyFrame> 
    </ColorAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="LayoutRoot"> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6"> 
      <EasingDoubleKeyFrame.EasingFunction> 
       <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
      </EasingDoubleKeyFrame.EasingFunction> 
     </EasingDoubleKeyFrame> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="LayoutRoot"> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6"> 
      <EasingDoubleKeyFrame.EasingFunction> 
       <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
      </EasingDoubleKeyFrame.EasingFunction> 
     </EasingDoubleKeyFrame> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

Как я могу убедиться, что анимация не джем, когда раскадровка получает новый Begin вызов, прежде чем он заканчивает играть? Я в порядке с перезагрузкой анимации при каждом вызове функции или без запуска новой анимации, пока она все еще играет. По какой-то причине, это дает исключение не может выполнить действие, поскольку указанная Раскадровка не была применена к этому объекту для интерактивного управления:

Storyboard highlighter = FindResource("Highlight") as Storyboard; 
if (highlighter.GetCurrentState(this) == ClockState.Stopped) 
    highlighter.Begin(this, true); 

Update: Я попробовал этот XAML на основе решения, основанное на Ответ XAMIMAX, но когда я использую это, анимация не воспроизводится вообще.

<UserControl.Triggers> 
    <EventTrigger RoutedEvent="local:StatusIcon.HighlightRequested"> 
     <EventTrigger.EnterActions> 
      <BeginStoryboard x:Name="bidHighlight" Storyboard="{StaticResource Highlight}" /> 
     </EventTrigger.EnterActions> 
     <EventTrigger.ExitActions> 
      <StopStoryboard BeginStoryboardName="bidHighlight" /> 
     </EventTrigger.ExitActions> 
    </EventTrigger> 
</UserControl.Triggers> 
+0

Вы пробовали это? [MSDN] (http://msdn.microsoft.com/en-us/library/cc663151 (v = vs.110) .aspx) – XAMlMAX

+0

Увы, у меня такое же исключение, когда я тестировал * highlighter.GetCurrentProgress (это) == null *. – Pieter

+0

Как вы относитесь к использованию триггеров в вашем «xaml», а не в подсветке кода? – XAMlMAX

ответ

1

Моя проблема ушла, когда я явно определить начальное значение для каждого анимированного свойства в ключевом кадре 0. Вот мой код:

<Storyboard x:Key="Highlight" AutoReverse="True"> 
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Border"> 
     <EasingColorKeyFrame KeyTime="0" Value="White"/> 
     <EasingColorKeyFrame KeyTime="0:0:0.15" Value="LightGray"> 
      <EasingColorKeyFrame.EasingFunction> 
       <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
      </EasingColorKeyFrame.EasingFunction> 
     </EasingColorKeyFrame> 
    </ColorAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="LayoutRoot"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6"> 
      <EasingDoubleKeyFrame.EasingFunction> 
       <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
      </EasingDoubleKeyFrame.EasingFunction> 
     </EasingDoubleKeyFrame> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="LayoutRoot"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6"> 
      <EasingDoubleKeyFrame.EasingFunction> 
       <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
      </EasingDoubleKeyFrame.EasingFunction> 
     </EasingDoubleKeyFrame> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)" Storyboard.TargetName="LayoutRoot"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleY)" Storyboard.TargetName="LayoutRoot"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 
+0

Ницца! Хорошо подмечено! – XAMlMAX

0

Если вы хотите сделать это через xaml:

Assumption - Models or View Models Implement INotfifyPropertyChanged

Допустим, что у вас есть список фильмов

<ListView 
      ScrollViewer.CanContentScroll="False" 
      x:Name="lsvMovies" 
      ItemsSource="{Binding Movies}" 
      SelectedItem ="{Binding SelectedMovie}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="Auto" Header="Code"   DisplayMemberBinding="{Binding ID}"></GridViewColumn> 
        <GridViewColumn Width="Auto" Header="Description" DisplayMemberBinding="{Binding Desc}"></GridViewColumn> 
        <GridViewColumn Width="Auto" Header="Qty"   DisplayMemberBinding="{Binding Qty}"></GridViewColumn> 
        <GridViewColumn Width="Auto" Header="Gross"   DisplayMemberBinding="{Binding Price}"></GridViewColumn> 
        <GridViewColumn Width="Auto" Header="Discount %" DisplayMemberBinding="{Binding Discount}"></GridViewColumn> 
        <GridViewColumn Width="Auto" Header="Net"   DisplayMemberBinding="{Binding Gross}"></GridViewColumn> 
        <GridViewColumn Width="Auto" Header="Title"   DisplayMemberBinding="{Binding Title}"></GridViewColumn> 
       </GridView> 
      </ListView.View> 
      <ListView.GroupStyle> 
       <GroupStyle ContainerStyle="{StaticResource GroupedView}"/> 
      </ListView.GroupStyle> 
     </ListView> 

Игнорируйте GroupStyle это там расширителя.

<Style x:Key="{x:Type ListViewItem}" TargetType="ListViewItem"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding BidChangeDirectionIndicator}" 
        Value="-1"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard x:Name="bidDownStory"> 
        <Storyboard> 
         <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Border"> 
          <EasingColorKeyFrame KeyTime="0:0:0.15" Value="LightGray"> 
           <EasingColorKeyFrame.EasingFunction> 
            <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
           </EasingColorKeyFrame.EasingFunction> 
          </EasingColorKeyFrame> 
         </ColorAnimationUsingKeyFrames> 
         <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="LayoutRoot"> 
          <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6"> 
           <EasingDoubleKeyFrame.EasingFunction> 
            <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
           </EasingDoubleKeyFrame.EasingFunction> 
          </EasingDoubleKeyFrame> 
         </DoubleAnimationUsingKeyFrames> 
         <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="LayoutRoot"> 
          <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6"> 
           <EasingDoubleKeyFrame.EasingFunction> 
            <ElasticEase EasingMode="EaseIn" Oscillations="1"/> 
           </EasingDoubleKeyFrame.EasingFunction> 
          </EasingDoubleKeyFrame> 
         </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
       <StopStoryboard BeginStoryboardName="bidDownStory" /> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Место Style выше, где бы вы ни были. НТН
Этот стиль был основан на этом вопросе WPF DataTriggers

+0

Я определил 'DataTrigger' в' UserControl.Triggers', но теперь я получаю исключение во время выполнения. * Члены коллекции Triggers должны иметь тип EventTrigger *. Я попробую выполнить пользовательское событие и вернуться к вам. – Pieter

+0

Программа запускается, когда я использую триггеры событий, но действие 'StopStoryboard', кажется, отменяет всю анимацию.Когда я использую только действие 'BeginStoryboard' под' EventTrigger.Actions', ту же самую проблему с помехами анимации, о которой я сообщал ранее, всплывает, даже когда я оставляю там раздел EventTrigger.ExitActions'. Я добавил фрагмент кода моего триггера в начало сообщения. – Pieter

+0

Что делать, если вы попытаетесь добавить тот же 'BeginSoryBoard' к вашему' ExitAction'? – XAMlMAX

Смежные вопросы