2009-06-28 6 views
1

У меня есть usercontrol, что, когда я дважды нажимаю на него, я хочу, чтобы он увеличивался, если его еще нет. Если это так, то двойной щелчок уменьшит его. Я могу заставить его работать с кодом позади, но я не могу заставить его работать в xaml. Вот код за этим двойным щелчком мыши.Trigger Animations

void MyObjectMouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     if (IsZoomedIn) 
     { 
      IsZoomedIn = false; 
      //ZoomOutAnimation(); 
     } 
     else 
     { 
      IsZoomedIn = true; 
      //ZoomInAnimation(); 
     } 
    } 

то в моем XAML:

<UserControl.RenderTransform> 
    <TransformGroup> 
     <RotateTransform /> 
     <ScaleTransform /> 
     <TranslateTransform /> 
    </TransformGroup> 
</UserControl.RenderTransform> 

<UserControl.Style> 
    <Style> 
     <Style.Triggers> 
      <Trigger Property="local:MyObject.IsZoomedIn" Value="False"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="(UserControl. 
          RenderTransform).(TransformGroup.Children)[1]. 
          (ScaleTransform.ScaleX)" To="1" Duration="0:0:.3" /> 
          <DoubleAnimation Storyboard.TargetProperty="(UserControl. 
          RenderTransform).(TransformGroup.Children)[1]. 
          (ScaleTransform.ScaleY)" To="1" Duration="0:0:.3" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
      </Trigger> 
      <Trigger Property="local:MyObject.IsZoomedIn" Value="True"> 
       <Trigger.EnterActions>   
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetProperty="(UserControl. 
         RenderTransform).(TransformGroup.Children)[1]. 
         (ScaleTransform.ScaleX)" To="2" Duration="0:0:.3" /> 
         <DoubleAnimation Storyboard.TargetProperty="(UserControl. 
         RenderTransform).(TransformGroup.Children)[1]. 
         (ScaleTransform.ScaleY)" To="2" Duration="0:0:.3" /> 
        </Storyboard> 
       </BeginStoryboard> 
       </Trigger.EnterActions> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Style> 

После того, как он наезжает на моем UserControl, зум из анимации не работает. Любая помощь оценивается.
Спасибо.

ответ

4

Ваши анимации сохраняют значения, поэтому вторая анимация не появляется, даже если срабатывает триггер. Вместо двух отдельных триггеров вы можете использовать Trigger.ExitActions, как вы используете EnterActions.

<Trigger Property="IsZoomedIn" 
     Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard> 
      <Storyboard > 
       <DoubleAnimation Storyboard.TargetProperty="(UserControl.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"  
           To="2" 
           Duration="0:0:.3" /> 
       <DoubleAnimation Storyboard.TargetProperty="(UserControl.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)" 
           To="2" 
           Duration="0:0:.3" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimation Storyboard.TargetProperty="(UserControl.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" 
           To="1" 
           Duration="0:0:.3" /> 
       <DoubleAnimation Storyboard.TargetProperty="(UserControl.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)" 
           To="1" 
           Duration="0:0:.3" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </Trigger.ExitActions> 
</Trigger> 
+0

Спасибо! Но я все еще не совсем понимаю, почему ваш код работает. Я знаю, что это может быть не так «правильно», чтобы думать об этом таким образом, но это потому, что EnterActions больше похож на «if true», а ExitActions больше похож на «else»?
Спасибо. – jkidv

+0

EnterActions и ExitActions более сродни инициализации и уничтожению, если/else. Кажется, что это происходит из-за порядка триггеров, по какой-то причине они не могут «передать» друг другу, а раскадровки будут вынуждать их значения в пользовательском интерфейсе, поскольку у них есть один из более высоких приоритетов. Я не использую раскадровки достаточно часто, чтобы окончательно прокомментировать, почему он не работает, но перемещая его на один триггер или явно останавливая каждую раскадровку в действиях выхода, это исправляет. http://msdn.microsoft.com/en-us/library/ms743230.aspx – rmoore