2013-08-08 14 views
8

Attualmente hoInserimento di una guardia su un trigger evento WPF. È possibile?

<ContentControl 
    Grid.Column="2" Grid.Row="3" 
    > 
    <ContentControl.Triggers> 
     <EventTrigger RoutedEvent="UIElement.MouseEnter"> 
      <BeginStoryboard 
       Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/> 
     </EventTrigger> 
    </ContentControl.Triggers> 

    ... <snip> ... 

</ContentControl> 

e

<Grid.Resources> 
     <Storyboard x:Key="ShakeStatorMinorRadiusEdit"> 
      <DoubleAnimationUsingKeyFrames 
         Storyboard.TargetName="StatorMinorRadiusEdit" 
         Storyboard.TargetProperty="RenderTransform.X" 
         RepeatBehavior="5x" 
         > 
       <EasingDoubleKeyFrame KeyTime="0:0:0.05" Value="0"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="3"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.20" Value="-3"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="0"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </Grid.Resources> 

enter image description here

L'idea è che quando il mouse entra giallo evidenziato controllo a sinistra il giallo evidenziato controllo sulla destra agiterà. Il controllo sulla destra ha la x: Name = StatorMinorRadiusEdit Fin qui tutto bene funziona.

Ora voglio aggiungere un'altra complicazione. Voglio solo che l'animazione si inneschi se un valore sul mio modello di vista RotorLobes == 1. In un mondo immaginario farei.

<ContentControl 
    Grid.Column="2" Grid.Row="3" 
    > 
    <ContentControl.Triggers> 
     <EventTrigger RoutedEvent="UIElement.MouseEnter"> 

      <If Property="{Binding RotorLobes}" Value="1"/> 

      <BeginStoryboard 
       Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/> 
     </EventTrigger> 
    </ContentControl.Triggers> 

    ... <snip> ... 

</ContentControl> 

Nel mondo reale non ho idea di come ottenere ciò.

+0

Sfortunatamente la risposta di Mark Green non funziona, anche se è stata davvero una buona prova. Probabilmente non è una buona idea segnare persone superiori. – bradgonesurfing

+0

Spero che la mia risposta modificata ti avvicini un po '. –

+0

Sì. Sono abbastanza sicuro che aggiri il problema che ho identificato. XAML è davvero un maiale. Ad esempio, è impossibile definire uno story board come risorsa statica e quindi applicarlo a un elemento remoto tramite TargetName in qualsiasi modo ragionevole. – bradgonesurfing

risposta

4

Si potrebbe provare a passare da EventTrigger a MultiTrigger e utilizzare la proprietà IsMouseOver anziché l'evento MouseEnter. Tuttavia, come hai scoperto, gli storyboard negli stili non ti permettono di specificare un TargetName, quindi è importante spostare i trigger sull'oggetto di destinazione.

L'esempio seguente codifica il valore di Rotor su 1 e sarà necessario disporre di uno spazio dei nomi correttamente RenderTransform in TargetProperty o si otterrà un'eccezione di runtime.

<Grid> 
     <Grid.Resources> 
      <Storyboard x:Key="ShakeStatorMinorRadiusEdit"> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)" 
               RepeatBehavior="5x"> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.05" 
              Value="0" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.1" 
              Value="3" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.15" 
              Value="0" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.20" 
              Value="-3" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.25" 
              Value="0" /> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </Grid.Resources> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <TextBlock Grid.Column="1">Rotor</TextBlock> 
     <TextBlock Grid.Column="2">Stator</TextBlock> 

     <TextBlock Grid.Column="0" 
        Grid.Row="1">Lobes</TextBlock> 
     <TextBlock Grid.Column="0" 
        Grid.Row="2">Major Radius</TextBlock> 
     <TextBlock Grid.Column="0" 
        Grid.Row="3">Minor Radius</TextBlock> 

     <TextBox Name="RotorLobes" 
       Grid.Column="1" 
       Grid.Row="1" 
       Text="1" /> 
     <TextBox Grid.Column="1" 
       Grid.Row="2" /> 
     <TextBox Name="MinorRadiusRotor" 
       Background="Blue" 
       Grid.Column="1" 
       Grid.Row="3" /> 

     <TextBox Grid.Column="2" 
       Grid.Row="1" /> 
     <TextBox Grid.Column="2" 
       Grid.Row="2" /> 
     <TextBox Name="MinorRadiusStator" 
       Background="Green" 
       Grid.Column="2" 
       Grid.Row="3"> 
      <TextBox.Style> 
       <Style> 
        <Style.Triggers> 
         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 
           <Condition Binding="{Binding ElementName=MinorRadiusRotor, Path=IsMouseOver}" 
              Value="True" /> 
           <Condition Binding="{Binding ElementName=RotorLobes, Path=Text}}" 
              Value="1" /> 
          </MultiDataTrigger.Conditions> 
          <MultiDataTrigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}" /> 
          </MultiDataTrigger.EnterActions> 
         </MultiDataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 

    </Grid> 
+0

EnterAction super :) Non è proprio la risposta alla domanda di mettere una guardia sull'evento ma risolverà il mio problema specifico. – bradgonesurfing

+0

In realtà non funziona per un problema sottile. Perché voglio attivare uno storyboard e lo storyboard deve usare '' Storyboard.TargetName = "StatorMinorRadiusEdit'' per fare riferimento al controllo a destra. Ottengo un errore XAML che dice che non posso usare' 'TargetName'' in uno stile. Quando guardi questo attraverso google, alcuni dei post dicono di usare EventTriggers e poi torniamo alla domanda originale Grrrrrrrr – bradgonesurfing

+0

Spero non ti dispiaccia Ho aggiornato la tua risposta con lo XAML completamente rifinito per illustrare il problema. – bradgonesurfing

Problemi correlati