2013-08-08 20 views
8

Obecnie mamUmieszczenie osłony na wyzwalaczu zdarzeń WPF. czy to możliwe?

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

    ... <snip> ... 

</ContentControl> 

i

<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

Chodzi o to, że kiedy wchodzi mysz żółtą podÊwietlonego na lewym żółto podświetlone sterowanie po prawej zadrży. Kontrolka po prawej stronie ma x: Name = StatorMinorRadiusEdit Jak dotąd tak dobrze działa powyższe.

Teraz chcę dodać kolejną komplikację. Chcę tylko, aby animacja została uruchomiona, jeśli wartość w moim modelu widoku RotorLobes == 1. W urojonym świecie zrobiłbym to.

<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> 

W realnym świecie nie mam pojęcia, jak to osiągnąć.

+0

Niestety odpowiedź od Marka Greena nie działa, chociaż była naprawdę dobra i podobna. Prawdopodobnie nie jest dobrym pomysłem, aby oznaczyć go wyżej. – bradgonesurfing

+0

Mam nadzieję, że moja zredagowana odpowiedź przybliży Cię trochę. –

+0

Tak. Jestem prawie pewien, że omija problem, który zidentyfikowałem. XAML to naprawdę świnia. Na przykład niemożliwe jest zdefiniowanie tablicy opowieści jako zasobu statycznego, a następnie zastosowanie jej do elementu zdalnego za pomocą TargetName w rozsądny sposób. – bradgonesurfing

Odpowiedz

4

Możesz spróbować zmienić z EventTrigger na MultiTrigger i używając właściwości IsMouseOver zamiast zdarzenia MouseEnter. Jednak, jak odkryłeś, storyboardy w stylach nie pozwalają na określenie TargetName, więc ważne jest, aby przenieść wyzwalacze do obiektu docelowego.

Poniższy przykład zakodowuje wartość Rotora do 1 i trzeba poprawnie nazwać przestrzeń RenderTransform w TargetProperty lub dostaniesz wyjątek środowiska wykonawczego.

<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 :) Niezupełnie odpowiedź na pytanie o postawienie warty na zdarzenie, ale rozwiąże mój konkretny problem. – bradgonesurfing

+0

W rzeczywistości nie działa z powodu subtelnego problemu. Ponieważ chcę wywołać scenorys, a scenorys musi użyć '' Storyboard.TargetName = "StatorMinorRadiusEdit'', aby odnieść się do prawej kontrolki, otrzymuję komunikat XAML mówiący, że nie mogę użyć' TargetName'' w stylu. Kiedy patrzysz na to przez google, niektóre posty mówią, że zamiast tego używają EventTriggers, a następnie wracamy do pierwotnego pytania: Grrrrrrr – bradgonesurfing

+0

Mam nadzieję, że nie masz nic przeciwko. Zaktualizowałem twoją odpowiedź w pełni rozwiniętym XAML, aby zilustrować problem. – bradgonesurfing

Powiązane problemy